2015-08-07 6 views
1
#include <iostream> 
using namespace std; 

int main() 
{ 
    int x; 
    cin >> x; 
    if (x == EOF) 
     cout << x; 
    system("pause"); 
} 

Ввод EOF на Windows ничего не выводит. В то время как -1 выходов -1.EOF не всегда^Z на Windows?

За здесь

#include <iostream> 
using namespace std; 

int main() 
{ 
    int x; 
    if ((x=cin.get()) == EOF) 
     cout << x; 
    system("pause"); 
} 

Ввод в EOF на Windows, выходы -1. Пока -1 ничего не выводит.

Теперь я совершенно запутался (я работаю на 64-битной ОС Windows 7 с Visual Studio 2015, хотя я не думаю, что это связано)

Я также хочу добавить, если «х» присваивается EOF в обоих случаях, откуда эта разница? Я сравниваю значение «x» с EOF в обоих случаях, правильно?

+1

'cin.get()' возвращает 'EOF', если данных нет, поэтому, конечно, сравнение проходит. EOF не является таким персонажем, как вы его рассматриваете. Если вы вводите EOF, это не символ, который читается и сохраняется как 'EOF'. 'EOF' - просто магическое число, представляющее состояние. – chris

+1

@chris Я не понимаю вас, если честно:/ Если EOF не является кафариком, что назначается «x» в первом случае? А что во втором случае? Потому что я сравниваю «x» с EOF в обоих случаях правильно? – hussamash

+0

[вход не работает] (http://en.cppreference.com/w/cpp/locale/num_get/get) в первом случае, потому что читать нечего (ввод EOF завершает данные, это не данные) и конвертировать в 'int' для хранения в' x'. Однако сохранение «EOF» в результате не будет работать даже во всех случаях из-за таких типов, как указатели, которые не могут его сохранить. Вы должны проверить флаги 'std :: cin'. Вход [все еще не работает] (http: //en.cppreference.com/w/cpp/io/basic_istream/get) во втором случае, но он использует возвращаемое значение для возврата 'EOF'. – chris

ответ

0

EOF - макрос, который расширяется до отрицательного значения int (обычно -1).

Это номер, возвращаемый некоторыми функциями ввода, указывающими, что произошел конец файла. Это не связано с тем, как состояние конечного файла было вызвано вашей операционной системой (нажимая^Z или заканчивая ввод или что-то еще).

Код:

int x; 
cin >> x 

выполняет форматированный ввод. Операторыи << предназначены для форматированного ввода-вывода. Это означает прочитать текстовое представление числа и преобразовать его в int. Единственный способ получить x == -1 - это если вы на самом деле введите -1, как вы уже нашли.

Чтобы определить, произошел ли конец файла, вы можете проверить поток через cin.eof() после выполнения чтения. (Обратите внимание, что обычно you should check for all failure modes, а не только конец файла).

Этот код:

if ((x=cin.get()) == EOF) 

будет соответствовать, если произошла с истекшим файла, потому что istream::get() это одна из тех немногих функций, которые указывают на знак конца файла состояние через возвращаемое значение. Опять же, вы выводите значение макроса EOF, что не связано с тем, что вы делали в своей операционной системе, чтобы генерировать условие конца файла.

+0

отличный ответ! (Y), – hussamash