#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 несколько неясен. В любом случае, вам не нужно смотреть на какую-либо реализацию, только на документацию интерфейса, поскольку она четко говорит вам, что вы должны предоставить.