Correcte manier om cin.fail() te gebruiken

Wat is de juiste manier om cin.fail();te gebruiken?

Ik ben een programma aan het maken waarin je iets moet invoeren. Het is niet erg duidelijk of u een cijfer of teken moet invoeren. Wanneer een gebruiker een teken invoert in plaats van een nummer, wordt de console gek. Hoe kan ik cin.fail()gebruiken om dit op te lossen?

Of is er een betere manier?


Antwoord 1, autoriteit 100%

cin.fail()geeft true terug als het laatste cin-commando is mislukt, en anders false.

Een voorbeeld:

int main() {
  int i, j = 0;
  while (1) {
    i++;
    cin >> j;
    if (cin.fail()) return 0;
    cout << "Integer " << i << ": " << j << endl;  
  }
}

Stel nu dat je een tekstbestand hebt – input.txt en de inhoud is:

 30 40 50 60 70 -100 Fred 99 88 77 66

Als je bovenstaand korte programma daarop uitvoert, zal het resultaat zijn als:

 Integer 1: 30
  Integer 2: 40
  Integer 3: 50
  Integer 4: 60
  Integer 5: 70
  Integer 6: -100

het gaat niet verder na de 6e waarde omdat het stopt na het lezen van het zevende woord, omdat dat geen geheel getal is: cin.fail()geeft true.


Antwoord 2, autoriteit 93%

std::cin.fail()wordt gebruikt om te testen of de voorgaande invoer
geslaagd. Het is echter idiomatischer om gewoon de
stream alsof het een boolean is:

if ( std::cin ) {
    //  last input succeeded, i.e. !std::cin.fail()
}
if ( !std::cin ) {
    //  last input failed, i.e. std::cin.fail()
}

in contexten waarbij de syntaxis van de ingangsvergunning een aantal
van een personage is de gebruikelijke oplossing om het te lezen door lijnen (of in
een andere snaarvorm) en ontleed het; Wanneer u dat detecteert
Er is een getal, u kunt een std::istringstreamgebruiken
Converteer het, of een willekeurig aantal andere alternatieven (strtol, OF
std::stoiAls u C++ 11 hebt).

Het is echter mogelijk om de gegevens rechtstreeks uit de
Stream:

bool isNumeric;
std::string stringValue;
double numericValue;
if ( std::cin >> numericValue ) {
    isNumeric = true;
} else {
    isNumeric = false;
    std::cin.clear();
    if ( !(std::cin >> stringValue) ) {
        //  Shouldn't get here.
    }
}

Other episodes