Gå til innhold

Noob trenger hjelp til å tømme buffer


Anbefalte innlegg

Hei og hå . Har ikke drevet med c++ så veldig lenge og den lille tiden jeg har drevet med det har jeg brukt borland c++ 5.02 fra '95 ellerno som vi bruker på skolen. Det har i og for seg gått greit, inntil nå.

 

Har lastet ned et par nye gratis compilere (minGW og blooshed) og det er tydelig at det er visse forskjeller.

Koden nedenfor virket fint med borland compileren(tviler på at den er ansi c++ compliant, det er ansi c++ standarden fra 97 heter er det ikke?), men i de andre looper den uendelig.

Koden skal sjekke om variablen er den typen den er declarert som (i dette tilfellet int) , og hvis ikke skal den prompte brukern om ny input. Gjorde den om til en if statement og fant ut at cin.good() virker fint mens cin.seekg(0) og cin.clear() trolig er de som ikke virker likt som jeg er vant med. Jeg vil ha dem til å tømme bufferen og gjøre den klar for ny input men det går tydeligvis ikke.

Får ingen feilmeldinger under debuging så jeg synes det er litt rart.

Har lest på www.cplusplus.com og søkt i forumet uten å finne noen løsning.

 

int a;

 

cout << "please enter an integer:";

cin >> a;

 

while (!cin.good())

{

 

cin.seekg(0);

cin.clear();

cout <<"Error. Input must be an integer.Please re-enter:";

cin >> a;

}

 

cout << "You entered :" << a;

 

På forhånd takk for svar.

 

Mvh

Tatern

 

Ps.: Kommer nok ikke til å kunne svare på eventuelle spørsmål før om en 12 timers tid. studerer på New Zealand og her kl 02.00 og jeg skal på uni kl 07.00...

Endret av Tatern
Lenke til kommentar
Videoannonse
Annonse

#include <iostream>
#include <sstream>
#include <string>

using namespace std;


// Read from STDIN into "any" type.
template<typename T>
void readStdin(T& t, std::string msg = "", std::string onWrongInput = "Wrong input, try again!\n")
{	
std::cout << msg << std::flush;
while(!(std::cin >> t)) {
 cout << onWrongInput;
 std::cin.clear();
 std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
 std::cout << msg << std::flush;
}
} // readStdin()


int main()
{
int i;
readStdin(i, "Skriv inn et heltall: ", "Du skrev ikke inn et heltall, forsøk igjen!\n");
cout << "Du skrev inn: " << i << endl;
return(0);
} // main()

 

Under kjøring:

Skriv inn et heltall: h

Du skrev ikke inn et heltall, forsøk igjen!

Skriv inn et heltall: 3

Du skrev inn: 3

 

Tatt herfra: http://scm.nostdal.net/cgi-bin/viewcvs.cgi....viewcvs-markup

(finner masse annet kjekkt der, derfor jeg linker)

 

Edit:

Altså, ignore(...) tømmer input-bufferen.

Endret av søppel
Lenke til kommentar

Takker for svarene.

Ignore funket glimrende!

Litt kjipt dette med den borland compileren, ser at

kode snuttene deres og andres her på forumet ser litt anderledes

ut en det jeg har lært. Har feks. aldri brukt namespace eller template,

og har heller ikke brukt "std::" foran noe før. Får spørre forelesern om det i morgen.

 

Uansett, takker så mye for svarene.

 

Mvh Tatern

Lenke til kommentar
Får spørre forelesern om det i morgen.

 

Du kan jo eventuellt kreve at han/hun må ansette en assistent (meg) .. :green:

 

Edit:

Det finnes gratis-compilere som støtter standarden, dev-cpp f.eks: www.bloodshed.net

Endret av søppel
Lenke til kommentar

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...