Gå til innhold

[Løst sånn halvveis] Lage en "loading bar"


Anbefalte innlegg

Skrevet (endret)

Hei,

 

Jeg prøver å lage en falsk loading bar, for eksempel:

cout << "\r[----------]";
system("sleep 0.3");
cout << "\r[#---------]";
system("sleep 0.3");
cout << "\r[##--------]";
system("sleep 0.3");
cout << "\r[###-------]";
system("sleep 0.3");
cout << "\r[####------]";
system("sleep 0.3");
cout << "\r[#####-----]";
system("sleep 0.3");
cout << "\r[######----]";
system("sleep 0.3");
cout << "\r[#######---]";
system("sleep 0.3");
cout << "\r[########--]";
system("sleep 0.3");
cout << "\r[#########-]";
system("sleep 0.3");
cout << "\r[##########]";
system("sleep 0.3");
cout << "\nLoading complete!\n";

Problemet mitt er at det ikke vises slik man skulle tro. Ettter litt frem og tilbake så virker det som std::cout buffrer all output frem til et linjeskift, og så viser den linjen på skjermen. Er det en måte å unngå dette, ved f.eks. en annen output-kommando?

 

Jeg har fått det til å funke ved en clear rett før neste linje skrives, men da er det ikke så gøy lenger.

 

(Ja, jeg er klar over at dette er et litt meningsløst prosjekt, men jeg vil bare se om det går an :p )

Endret av øsse87
Videoannonse
Annonse
Skrevet

Jeg fant ut av det sånn halvveis. std::cerr tømmer visstnok bufferen etter enhver output-operasjon. Da jeg erstattet cout med cerr i koden over fungerte det akkurat slik jeg håpte det skulle gjøre.

 

Det er visst en kommando std::flush som også skal gjøre jobben, men den fikk jeg ikke til å funke. Hvordan brukes denne? Og litt off-topic: hvordan spesifiserer jeg hvor cerr skal skrive output? Slik jeg forstår det er cout og cerr ment til forskjellige ting, hvor cerr skal skrive feilmeldinger.

Skrevet (endret)

eller :

#include <windows.h>

using namespace std;

int main()
{

cout << "Checking.";
Sleep(100);
system("CLS");
cin.clear();
cout << "Checking..";
Sleep(100);
system("CLS");
cin.clear();
cout << "Checking...";
Sleep(100);
system("CLS");
cin.clear();
cout << "Checking.";
Sleep(100);
system("CLS");
cin.clear();
cout << "Checking..";
Sleep(100);
system("CLS");
cin.clear();
cout << "Checking...";
Sleep(300);
system("CLS");
cin.clear();

}

;)

Endret av FR!K
Skrevet (endret)

Det er også mulig å lage sitt eget buffer og skippe std::cout fullstendig.

Fordelen er at man da kan endre en ting uten å måtte tegne alt på nytt.

Endret av GeirGrusom
  • 2 uker senere...
Skrevet

for(int a = 1; a < 99; a++)
{
	cout << "#";
	Sleep (500);
}

 

Jeg er helt nybegynner men den bør da gjøre det samme som den i førsteposten, bare med mindre kode. Eller?

Skrevet

Veldig veldig enkelt dette her (For å gi en komplett løsning..)

cout << std::flush << "\r[------]";
system("sleep 0.3");
cout << std::flush << "\r[#-----]";
system("sleep 0.3");
cout << std::flush << "\r[##----]";
system("sleep 0.3");
cout << std::flush << "\r[###---]";
etc...

 

=)

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...