Нужен ли ios :: in для ifstream, открытого в двоичном режиме? - PullRequest
7 голосов
/ 18 сентября 2011

Какая разница между этими двумя? Разве объект-флаг in не является избыточным? Благодаря.

std::ifstream file1("one.bin", std::ifstream::in | std::ifstream::binary);

std::ifstream file2("two.bin", std::ifstream::binary);

Ответы [ 3 ]

5 голосов
/ 18 сентября 2011

Из документов на ifstream конструктор класса:

двоичный файл (двоичный файл) Рассматривать поток как двоичный файл, а не как текст.
in (вход) Разрешить операции ввода в потоке.

Таким образом, при чтении из файла я бы использовал флаг std::ifstream::in не потому, что он требуется (или нет), а потому, что было бы хорошей практикой программирования сообщать интерфейсу программирования, для чего вы собираетесь его использовать. 1014 *

Edit:
Следующее взято из http://www.cplusplus.com/doc/tutorial/files/, о open() членской функции, хотя (но конструкторы в коде в вопросе, вероятно, вызывают open() копирование флагов режима без модификации).

класс: параметр режима по умолчанию
ofstream: ios :: out
ifstream: ios :: in
fstream: ios :: in | ios :: out

Для классов ifstream и ofstream ios :: in и ios :: out являются автоматически и соответственно предполагается, даже если режим, который не их включение передается как второй аргумент члену open () функция.

Тем не менее, многие примеры через Интернет используют ifstream::in при отображении конструкции объекта ifstream. Это действительно может быть практика суеверия вместо программирования.

2 голосов
/ 18 сентября 2011

binary в данном случае относится только к методу чтения или записи. В обычном режиме на окнах '\n' переводится в '\r''\n'. Это может повлиять как на чтение, так и на запись, поэтому двоичный режим отключает это. out|binary имеет такой же смысл, как и in|binary

1 голос
/ 18 сентября 2011

Я не могу найти авторитетную документацию в Интернете.

Редактировать Я даже не могу найти подходящую ссылку в своей копии Книга Йосуттиса , 8-й печати. Это должно было быть в разделе 13.9 с. 627-631

Эмпирические данные свидетельствуют о том, что это избыточный IFF, ни один из std :: ios :: in или std :: ios: out не передан:

#include <fstream>
#include <iostream>

int main(int argc, char** args)
{
    std::ifstream ifs(args[0], std::ios::binary);
    std::cout << ifs.rdbuf() << std::flush;

    return 0;
}

Успешно:

test | md5sum
md5sum test

показать ту же самую хэш-сумму.


    // ...
    std::ifstream ifs(args[0], std::ios::out | std::ios::binary);

не удастся (вывод нулевых байтов)

test | wc -c  # shows 0
...