Означает ли это, что нормальная ситуация EOF также приведет к тому, что fail () вернет true? Похоже, что это конфликтует с «кроме достижения конца файла».
Я рекомендую использовать ссылку, которая не полна ошибок.
http://en.cppreference.com/w/cpp/io/basic_ios/fail говорит:
Возвращает true
, если произошла ошибка в связанном потоке. В частности, возвращает true
, если в rdstate()
установлено badbit
или failbit
.
И стандарт C ++ гласит:
Возвращает: true
, если бит сбоя или badbit
установлен в rdstate()
.
Нет ничего, кроме конца файла. Операция, которая пытается прочитать после конца файла, также приведет к установке failbit
. eofbit
служит только для того, чтобы отличить эту конкретную причину сбоя от других (и это не так полезно, как может показаться на первый взгляд).
Я использую метод fail()
, чтобы проверить, не завершился ли «file.read ()». Это правильно?
Вы должны просто протестировать с преобразованием в bool
.
if(file) { // file is not in an error state
Это синоним !fail()
, но его удобнее использовать, потому что вы можете использовать его для непосредственного тестирования результата операции чтения без лишних скобок (такие вещи, как !(stream >> x).fail()
становятся неудобными):
if(file.read(fileBuf, fileLen)) { // read succeeded
Вы заметите, что все операции чтения в потоках возвращают сам поток, что позволяет вам это делать.
Почему он дает разные результаты на разных платформах?
Разница между Windows и Linux заключается в том, что файл открыт в текстовом режиме: символы новой строки будут преобразованы без вывода сообщений при реализации. Это означает, что комбинация "\r\n"
(используется в Windows для перевода строки) будет преобразована в один символ '\n'
в Windows, в результате чего файл будет иметь только 8 символов. Обратите внимание, что vim показывает ^M
в конце первой строки: это часть '\r'
. В Linux новая строка - просто '\n'
.
Вам следует открыть файл в двоичном режиме, если вы хотите сохранить оригинал как есть:
file.open(path, std::ios_base::in | std::ios_base::binary);