2016-06-13 4 views
9

Von dem, was ich über noskipws weiß, deaktiviert es das Überspringen von Leerstellen. So muss man in seinem Programm weiße Leerzeichen mit ein paar Zeichen aufnehmen, wenn sie mit noskipws arbeiten wollen. Ich versuche, den cin-eof Zustand durch Drücken von Strg + D (Ctrl +Z für Windows). Aber wenn ich einen char oder string Eingang verwende, dann wird der Strom auf das Ende der Datei mit einer einzigen Eingabe gesetzt. Wenn ich jedoch einen anderen Datentyp verwende, muss ich die Kombination zweimal drücken. Wenn ich die noskipws Anfrage lösche, funktioniert alles andere gut. Der folgende Code beschreibt das Problem genauer:C++: noskipws verzögert das Ende der Dateierkennung für einige Datentypen

#include <iostream> 

using namespace std; 

int main() 
{ 
    cin >> noskipws; //noskipws request 
    int number; //If this int is replaced with char then it works fine 
    while (!cin.bad()) { 
     cout << "Enter ctrl + D (ctrl + Z for windows) to set cin stream to end of file " << endl; 
     cin >> number; 
     if (cin.eof()) { 
      break; // Reached end of file 
     } 
    } 
    cout << "End of file encountered" << endl; 

    return 0; 
} 

Warum ist cin auf diese Weise zu verhalten? Obwohl es nicht in der Lage wäre, die Eingabe in die Variable int zu setzen, sollte es mindestens Flags zu eof sofort festlegen, wie es die Anforderung empfängt. Warum dauert es eine zweite Eingabe, selbst nachdem der Benutzer Ctrl + Z drückt?

+1

Könnten Sie klar sagen, was Eingang Sie bieten das unerwartete Verhalten mit diesem Code –

+0

I drücken Sie Strg + Z in der Konsole und die Konsole erfordert einen weiteren Eingang –

+0

Cross-Site-Duplikat zu erzeugen: [Entspricht^D (in bash) für cmd.exe?] (https://superuser.com/questions/291224/equivalent-to-d-in-bash-for-cmd-exe) –

Antwort

0

Wenn noskipws verwendet wird, ist Ihr Code für die Extraktion von Leerstellen verantwortlich. Wenn Sie Int lesen, schlägt es fehl, da Leerraum angetroffen wird.

Siehe an example:

#include <iostream> 
#include <iomanip> 
#include <cctype> 

#define NOSKIPWS 

#define InputStreamFlag(x) cout << setw(14) << "cin." #x "() = " << boolalpha << cin.x() << '\n' 

using namespace std; 

int main() 
{ 
#ifdef NOSKIPWS 
    cin >> noskipws; 
    char ch; 
#endif 
    int x; 
    while (cin >> x) { 
     cout << x << ' '; 
#ifdef NOSKIPWS 
     while (isspace(cin.peek())) 
     { 
      cin >> ch; 
     } 
#endif 
    } 
    cout << endl; 

    InputStreamFlag(eof); 
    InputStreamFlag(fail); 
    InputStreamFlag(bad); 
    InputStreamFlag(good) << endl; 

    return 0; 
} 

Oder visual studio.

Verwandte Themen