2016-06-13 14 views
9

Z tego, co wiem o noskipws, wyłącza przeskakiwanie białych znaków. Dlatego jeśli chcesz pracować z noskipws, musisz wziąć białe spacje za pomocą jakiegoś znaku w swoim programie. Staram się ustawić cin do eof stan naciskając Ctrl + D (Ctrl + Z dla Windows). Ale jeśli używam wejścia char lub string, strumień jest ustawiany na koniec pliku za pomocą pojedynczego wejścia. Jeśli jednak używam innego typu danych, wymaga to dwukrotnego naciśnięcia kombinacji. Jeśli usuniemy żądanie noskipws, wszystko inne działa poprawnie. Poniższy kod wyjaśnia problem dokładniej:C++: noskipws opóźnia wykrywanie końca pliku dla niektórych typów danych.

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

Dlaczego cin zachowuje się w ten sposób? Chociaż nie byłby w stanie wprowadzić danych wejściowych do zmiennej int, powinien przynajmniej ustawić flagi na eof natychmiast po otrzymaniu żądania. Dlaczego zajmuje drugie wejście, nawet jeśli użytkownik naciśnie klawiaturę?

+1

Czy możesz wyraźnie powiedzieć, jakie dane wejściowe dostarczasz, aby wygenerować nieoczekiwane zachowanie za pomocą tego kodu? –

+0

Wciskam ctrl + Z w konsoli, a konsola wymaga jeszcze jednego wejścia –

+0

Duplikat między lokacjami: [Odpowiednik do^D (w bash) dla cmd.exe?] (https://superuser.com/questions/291224/equivalent-to-d-in-bash-for-cmd-exe) –

Odpowiedz

0

Kiedy używany jest kod noskipws, kod jest odpowiedzialny za wyodrębnianie białych znaków. Kiedy czytasz int, to się nie powiedzie, ponieważ napotkana jest biała przestrzeń.

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

Powiązane problemy