eof bit: до или после сбоя чтения?

В настоящее время я пишу класс для некоторых операций ввода-вывода. Некоторые функции возвращают, была ли операция ввода-вывода успешной. Если я читаю файл, мне интересно, должен ли я вернуться std::ifstream::good() или же !std::ifstream::fail() чтобы указать, была ли операция ввода-вывода успешной.

Разница исходит от eof немного, и я не уверен, что я правильно понимаю.

Предположим, что у меня есть двоичный файл с 4 байтами в нем (1 целое число).

Предположим, что я прочитал это целое число.

Мой вопрос: будет ли eof флаг будет установлен после этой операции или после следующей операции ввода-вывода (что не удастся)?

Если он установлен сразу после этой операции, если моя функция чтения вернуться std::ifstream::good()тогда результат будет false (но целое число было правильно прочитано).

Можете ли вы объяснить мне, когда установлен бит eof и что я должен вернуть в конце своих функций?

3

Решение

Флаг EOF установлен после Вы пытаетесь прочитать конец потока.

Ваша функция должна возвращать ссылку на исходный поток, и вы должны использовать ее в цикле или в условии, например:

std::istream & process(std::istream & is)
{
int n;
if (is >> n) { std::cout << "Read one int: " << n << "\n"; }
return is;
}

int main()
{
std::ifstread infile("data.bin");

while (process(infile)) { }
}
5

Другие решения

Бит «eof» потока устанавливается, когда операция чтения пытается прочитать за конец потока. Операция чтения, которая читает за пределами конца потока, может или не может быть успешной. Это не зависит от того, установлен ли бит «eof».

По этой причине вы всегда должны проверять результат самой операции чтения, а не проверять состояние флагов потока после чтения.

Для примера всех четырех комбинаций:

#include <iostream>
#include <istream>

int main()
{
int n;
if (std::cin >> n)
std::cout << "read an int with value = " << n << '\n';
else
std::cout << "read of int failed\n";

std::cout << "cin.eof() = " << std::cin.eof() << '\n';
return 0;
}

Успешное чтение, которое устанавливает бит eof:

$ printf 1 | ./a.out
read an int with value = 1
cin.eof() = 1

Успешное чтение, которое не устанавливает бит eof:

$ echo 1 | ./a.out
read an int with value = 1
cin.eof() = 0

Неудачное чтение, которое не устанавливает бит eof:

$ printf abc | ./a.out
read of int failed
cin.eof() = 0

Неудачное чтение, которое устанавливает бит eof:

$ echo | ./a.out
read of int failed
cin.eof() = 1
5

Флаг eof устанавливается «после следующей операции ввода-вывода (которая завершится ошибкой)». Вы должны вернуться std::ifstream::good() после операции чтения, которая сообщает, были ли установлены какие-либо флаги ошибок.

0
По вопросам рекламы [email protected]