2016-06-13 9 views
9

Da quello che so su noskipws, disabilita il salto di spazi bianchi. Quindi si deve prendere degli spazi bianchi con qualche carattere nel loro programma se vogliono lavorare con noskipws. Io cerco di impostare la condizione cin-eof premendo Ctrl + D (Ctrl +Z per Windows). Ma se uso un input char o string, lo stream è impostato alla fine del file con un singolo input. Tuttavia, se uso qualche altro tipo di dati, mi impone di premere due volte la combinazione. Se rimuovo la richiesta noskipws, tutto il resto funziona correttamente. Il codice seguente illustra il problema più precisamente:C++: noskipws ritarda la fine del rilevamento di file per alcuni tipi di dati

#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; 
} 

Perché cin comportando in questo modo? Sebbene non sia in grado di inserire l'input nella variabile int, è necessario impostare i flag su eof immediatamente dopo aver ricevuto la richiesta. Perché richiede un secondo input anche dopo che l'utente preme Ctrl + Z?

+1

Puoi dire chiaramente quale input stai fornendo per produrre il comportamento imprevisto con questo codice –

+0

premo ctrl + Z in console e la console richiede un altro input –

+0

duplicato tra siti: [Equivalente a^D (in bash) per cmd.exe?] (https://superuser.com/questions/291224/equivalent-to-d-in-bash-for-cmd-exe) –

risposta

0

Quando viene utilizzato il codice noskipws, il codice è responsabile dell'estrazione degli spazi bianchi. Quando si legge int fallisce poiché si incontra uno spazio bianco.

Vedi 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; 
} 

Or visual studio.

Problemi correlati