Что возвращает eof ()?

Вот код:

string fname = "/home/jack/example.csv";
ifstream csvin(fname.c_str());
if (csvin.eof()) {
do_something;
}

Мой вопрос: в каком случае eof() возвращает истину. У меня есть следующие варианты:

  1. Файл не существует.
  2. Файл пуст
  3. Файл либо не существует, либо он пустой.

к несчастью документация не помогает, так как я не знаю eofbit error state flag средства. Я тоже не понимаю что End-of-File is reached in the sequence associated with the stream имею в виду. Я предполагаю, что c_str () возвращает некоторый итератор, и если он уже используется чем-то, он может уже достичь своего конца. Однако меня интересует простой случай, когда результат c_str() свежо, что он вернет, если файл не существует, и что он вернет, если файл пуст?

РЕДАКТИРОВАНИЕ

Я просто хотел бы знать, что приведенный выше код возвращает в двух случаях:

  1. Файл не существует.
  2. Файл пуст

2

Решение

EOF () возвращает true, когда позиция, в которой вы находитесь в потоке, из которого вы читаете, достигла конца файла. Это на самом деле возвращает значение флаг это устанавливается, когда конец файла был прочитан (попытка прочитать в прошлом). Проверять, выписываться C ++: .eof в пустом файле для обсуждения eof и пустых файлов!

4

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

eof возвращается true если установлен флаг eofbit (указывающий, что конец файла достигнут в случае ifstream).

Флаг eofbit может быть установлен всеми операциями ввода в потоке (например, read) когда операция ввода пытается прочитать после конца потока (iow: достигнут конец потока). Как указано в комментарии, хотя концептуально конец потока достигается, как только последний символ читается (или не читая ничего в пустом потоке), поток не узнает об этом, пока не попытается прочитать другой символ , Обратитесь к документации для каждой операции ввода для получения дополнительной информации.

Обратите внимание, что построение потока не является операцией ввода, поэтому в показанном вами примере кода eofbit не будет установлен к тому времени, когда он достигнет if заявление.
Если по какой-либо причине создание потока завершается неудачно (например, файл, который не существует), то будет установлен бит неудачи, который можно проверить с помощью fail,

РЕДАКТИРОВАТЬПросматривая ваши правки, я изложу вышесказанное, надеюсь, более четко:

В коде, который вы разместили, if условие никогда не будет оцениваться как истинное, потому что ifstream конструктор не устанавливает eofbit.

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

if (csvin.fail()) {
// oops : failed to open the file for reading (file doesn't exist, or has the wrong permissions, or ...)
}

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

2

eof() возвращается true если последняя операция в потоке предпринята попытка прочитать последний байт файла. Обратите внимание на то, что он говорит вам об успехе последней операции, а не об успехе следующей. Многие примеры кода ошибочно предполагают, что они сообщают вам что-то о следующей операции и, следовательно, содержат код, который будет вести себя не так, как ожидалось.

1

Там на самом деле небольшая степень зависимости реализации, как
когда eofbit установлено. (Функция eof() возвращает истину
если и только если eofbit установлено.) Требуется установить
если в процессе чтения что-то (отформатированный или
неформатирован), вызов streambuf::sgetc() (или один из
другие получатели символов) возвращает std::char_traits::eof(),
Не всегда понятно, когда реализация может выглядеть
символ впереди — если он получит конец файла, он
наборы eofbit; если он не делает прогноз, он не делает.

Я также не уверен, может ли реализация установить eofbit
в случаях, когда он знает, что следующее чтение должно вернуться eof,
фактически не прочитав; Я уверен, что
существующие реализации не, однако. (Вы действительно хотите
eofbit установить при поиске в конец файла?) Так по вашему
Например, вы почти наверняка никогда не увидите eof() возврате
правда.

Все это объясняет Зачем вы почти никогда не делаете input.eof() (или же
input.good(), который включает в себя eofbit в его значении как
Что ж). После попытки открыть файл, обычное условие
if ( input.is_open() ), хотя input.fail() можно использовать как
Что ж. При чтении уже открытого файла мы тестируем
input.fail() после попытка ввода, обычно с использованием
Потоковый объект в логическом контексте (т.е. if ( input ), или же if
( !input )
). После обнаружив сбой, мы можем использовать
eof() определить, был ли причиной неудачи конец
файла или другой ошибки (например, "abc" при попытке ввода
int). Даже тогда это не на 100% непогрешимо, и eof() может
вернуть true, даже если в формате произошла ошибка.
(Рассматривать:

std::istringstream s( "1.3E+" );
double d;
s >> d;

В этом случае, s.eof() почти наверняка вернет истину,
несмотря на тот факт, что ввод не удается из-за ошибки в
формат и не из-за конца файла.)

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