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ę?
Czy możesz wyraźnie powiedzieć, jakie dane wejściowe dostarczasz, aby wygenerować nieoczekiwane zachowanie za pomocą tego kodu? –
Wciskam ctrl + Z w konsoli, a konsola wymaga jeszcze jednego wejścia –
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) –