Разница между ifstream.good() и bool(ifstream)

Я пишу программу, которая берет несколько переменных из текстового файла. Когда программа находит EOF,
она заканчивает ввод данных.

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

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

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

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


person Szymon Bednorz    schedule 29.01.2017    source источник
comment
en.cppreference.com/w/cpp/io/basic_ios/good   -  person chris    schedule 30.01.2017


Ответы (2)


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

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

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

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

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

person WhiZTiM    schedule 29.01.2017

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

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

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

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

person marcinj    schedule 29.01.2017