Вот код:
string fname = "/home/jack/example.csv";
ifstream csvin(fname.c_str());
if (csvin.eof()) {
do_something;
}
Мой вопрос: в каком случае eof()
возвращает истину. У меня есть следующие варианты:
к несчастью документация не помогает, так как я не знаю eofbit error state flag
средства. Я тоже не понимаю что End-of-File is reached in the sequence associated with the stream
имею в виду. Я предполагаю, что c_str () возвращает некоторый итератор, и если он уже используется чем-то, он может уже достичь своего конца. Однако меня интересует простой случай, когда результат c_str()
свежо, что он вернет, если файл не существует, и что он вернет, если файл пуст?
РЕДАКТИРОВАНИЕ
Я просто хотел бы знать, что приведенный выше код возвращает в двух случаях:
EOF () возвращает true, когда позиция, в которой вы находитесь в потоке, из которого вы читаете, достигла конца файла. Это на самом деле возвращает значение флаг это устанавливается, когда конец файла был прочитан (попытка прочитать в прошлом). Проверять, выписываться C ++: .eof в пустом файле для обсуждения eof и пустых файлов!
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
был ли достигнут конец файла или нет.
eof()
возвращается true
если последняя операция в потоке предпринята попытка прочитать последний байт файла. Обратите внимание на то, что он говорит вам об успехе последней операции, а не об успехе следующей. Многие примеры кода ошибочно предполагают, что они сообщают вам что-то о следующей операции и, следовательно, содержат код, который будет вести себя не так, как ожидалось.
Там на самом деле небольшая степень зависимости реализации, как
когда 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()
почти наверняка вернет истину,
несмотря на тот факт, что ввод не удается из-за ошибки в
формат и не из-за конца файла.)