2017-01-29 8 views
4

Я пишу программу, которая принимает несколько переменных из текстового файла. Когда программа находит EOF,
заканчивается ввод данных.Разница между ifstream.good() и bool (ifstream)

int main() 
{ 
    int val, count = 0; 
    ifstream fileIn; 
    fileIn.open("num.txt"); 

    fileIn >> val; 
    while (fileIn) 
    { 
     ++count; 
     cout << "number: " << val << endl; 
     fileIn >> val; 
    } 
    cout << "count: " << count << endl; 

    fileIn.close(); 
    return 0; 
} 

num.txt файл: выход 11 22 33 44

Программа:

number: 11 
number: 22 
number: 33 
number: 44 
count: 4 

Все в порядке. Но если изменить условие раздел а из fileIn в fileIn.good(),
вывод программы будет выглядеть следующим образом:

number: 11 
number: 22 
number: 33 
count: 3 

Он скачет последнее значение в настоящее время. Почему это происходит и какая разница между fileIn
и fileIn.good()?

+0

http://en.cppreference.com/w/cpp/io/basic_ios/good – chris

ответ

4

Он пропускает последнее значение сейчас. Почему это происходит, а какая разница между fileIn и fileIn.good()?

fileIn >> val; 
while (fileIn) 
{ 
    ++count; 
    cout << "number: " << val << endl; 
    fileIn >> val; 
} 

Для заданного содержания "11 22 33 44" в потоке, связанного с fileIn. Использование bool(fileIn)conversion operator вернет, не потерял ли поток. Обратите внимание, что достижение eof() не является провалом потока. Отказ в основном происходит при сбое операции ввода-вывода.

Итак, прочитав последний номер 44 в val. Цикл вводится снова, потому что поток не сбой: count увеличивается, val печатается, но следующий fileIn >> val терпит неудачу. Которая затем будет проверена в состоянии цикла while, и отказ приведет к выходу цикла.

Выполнение fileIn.good() возвращает false, если был установлен какой-либо поток state flags. В частности, eof, fail и bad

2

if (fileIn) эквивалентно if (!fileIn.fail()), которая возвращает истину, если badbit или failbit установлен в rdstate().

С другой стороны fileIn.good() проверки, если rdstate() равно 0. Таким образом, в дополнение к fail() он также проверяет eofbit флаг.

Он пропускает последнее значение сейчас. Почему это происходит и какая разница между fileIn и fileIn.good()?

Поскольку вы читаете val затем проверить состояние потока с помощью while(fileIn.good()), а затем на выходе последнее значение, которое никогда не будет видно, потому что тогда fileIn имеет eofbit набор. Который не проверяется if(infs), как указано выше.