Зачем указывать std:: ios::in для ifstream?

#c #std #fstream #ifstream

#c #std #fstream #ifstream

Вопрос:

Я хочу использовать ifstream для загрузки файла шрифта в память и передачи его FreeType. Я нахожу стандартные средства ввода-вывода немного обескураживающими. На данный момент мой вопрос заключается в том, почему я должен указывать std::ios::in for ifstream ? Название ifstream уже подразумевает операции ввода, так зачем нам эти ненужные запутанные вещи? Можем ли мы указать ifstream с out помощью? Что произойдет, если я этого не укажу? Из примера на cppreference:

std::ifstream f1("test.bin", std::ios::binary);

Здесь аргумент по умолчанию std::ios::in не используется. Почему?

Ответ №1:

На данный момент мой вопрос заключается в том, почему я должен указывать std::ios::in для ifstream?

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

Сначала выполняет те же действия, что и конструктор по умолчанию, затем связывает поток с файлом, вызывая rdbuf()->open(filename, mode | std::ios_base::in)

Можем ли мы указать ifstream без out?

ДА. Это просто запросило бы файловый буфер для открытия файла также в режиме записи, возможно, создав его в процессе. Конечно, istream интерфейс не допускает никаких операций вывода, но вы можете повторно использовать filebuf для других операций / потоков, не закрывая / повторно открывая файл.

Комментарии:

1. Интересно, тогда зачем повторять std::ios_base::in по умолчанию, если в реализации это будет использоваться независимо ни от чего? Меня это смущает, потому что я думаю, что когда я предоставляю аргумент, значения по умолчанию использоваться не будут. И теперь я действительно должен пойти и посмотреть на реализацию, чтобы понять, должен ли я ее предоставить или что.

2. @olekstolar Я не могу сказать вам, почему некоторые вещи такие, какие они есть в стандартной библиотеке. Известно, что интерфейс потока ввода-вывода в C несколько неясен. В любом случае, вам не нужно смотреть на какую-либо реализацию, только на документацию интерфейса, поскольку она четко говорит вам, что вы должны предоставить.