Ofstream c что это
БлогNot. Лекции по C/C++: работа с файлами (fstream)
Лекции по C/C++: работа с файлами (fstream)
Механизм ввода-вывода, разработанный для обычного языка С, не соответствует общепринятому сегодня стилю объектно-ориентированного программирования, кроме того, он активно использует операции с указателями, считающиеся потенциально небезопасными в современных защищённых средах выполнения кода. Альтернативой при разработке прикладных приложений является механизм стандартных классов ввода-вывода, предоставляемый стандартом языка C++.
Открытие файлов
Наиболее часто применяются классы ifstream для чтения, ofstream для записи и fstream для модификации файлов.
Все поточные классы ввода-вывода являются косвенными производными от общего предка ios , полностью наследуя его функциональность. Так, режим открытия файлов задает член данных перечисляемого типа open_mode, который определяется следующим образом:
Ниже приведены возможные значения флагов и их назначение.
| Режим | Назначение |
| in | Открыть для ввода (выбирается по умолчанию для ifstream) |
| out | Открыть для вывода (выбирается по умолчанию для ofstream) |
| binary | Открыть файл в бинарном виде |
| aрр | Присоединять данные; запись в конец файла |
| ate | Установить файловый указатель на конец файла |
| trunc | Уничтожить содержимое, если файл существует (выбирается по умолчанию, если флаг out указан, а флаги ate и арр — нет) |
Например, чтобы открыть файл с именем test.txt для чтения данных в бинарном виде, следует написать:
Оператор логического ИЛИ ( | ) позволяет составить режим с любым сочетанием флагов. Так, чтобы, открывая файл по записи, случайно не затереть существующий файл с тем же именем, надо использовать следующую форму:
Предполагается, что к проекту подключён соответствующий заголовочный файл:
Для проверки того удалось ли открыть файл, можно применять конструкцию
Операторы включения и извлечения
Переопределённый в классах работы с файлами оператор включения ( << ) записывает данные в файловый поток. Как только вы открыли файл для записи, можно записывать в него текстовую строку целиком:
Можно также записывать текстовую строку по частям:
Оператор endl завершает ввод строки символом «возврат каретки»:
С помощью оператора включения несложно записывать в файл значения переменных или элементов массива:
В результате выполнения кода образуется три строки текстового файла Temp.txt :
Обратите внимание, что числовые значения записываются в файл в виде текстовых строк, а не двоичных значений.
Оператор извлечения ( >> )производит обратные действия. Казалось бы, чтобы извлечь символы из файла Temp.txt , записанного ранее, нужно написать код наподобие следующего:
Однако оператор извлечения остановится на первом попавшемся разделителе (символе пробела, табуляции или новой строки). Таким образом, при разборе предложения «Текстовый массив содержит переменные» только слово «Текстовый» запишется в массив buff , пробел игнорируется, а слово «массив» станет значением целой переменной vx и исполнение кода «пойдет вразнос» с неминуемым нарушением структуры данных. Далее, при обсуждении класса ifstream , будет показано, как правильно организовать чтение файла из предыдущего примера.
Класс ifstream: чтение файлов
Как следует из расшифровки названия, класс ifstream предназначен для ввода файлового потока. Далее перечислены основные методы класса. Большая часть из них унаследована от класса istream и перегружена с расширением родительской функциональности. К примеру, функция get , в зависимости от параметра вызова, способна считывать не только одиночный символ, но и символьный блок.
| Метод | Описание |
| open | Открывает файл для чтения |
| get | Читает один или более символов из файла |
| getline | Читает символьную строку из текстового файла или данные из бинарного файла до определенного ограничителя |
| read | Считывает заданное число байт из файла в память |
| eof | Возвращает ненулевое значение (true), когда указатель потока достигает конца файла |
| peek | Выдает очередной символ потока, но не выбирает его |
| seekg | Перемещает указатель позиционирования файла в заданное положение |
| tellg | Возвращает текущее значение указателя позиционирования файла |
| close | Закрывает файл |
Теперь понятно, как нужно модифицировать предыдущий пример, чтобы использование оператора извлечения данных давало ожидаемый результат:
Метод getline прочитает первую строку файла до конца, а оператор >> присвоит значения переменным.
Следующий пример показывает добавление данных в текстовый файл с последующим чтением всего файла. Цикл while (1) используется вместо while(!file2.eof()) по причинам, которые обсуждались в предыдущей лекции.
Этот код под ОС Windows также зависит от наличия в последней строке файла символа перевода строки, надежнее было бы сделать так:
Явные вызовы методов open и close не обязательны. Действительно, вызов конструктора с аргументом позволяет сразу же, в момент создания поточного объекта file , открыть файл:
Вместо метода close можно использовать оператор delete , который автоматически вызовет деструктор объекта file и закроет файл. Код цикла while обеспечивает надлежащую проверку признака конца файла.
Класс ofstream: запись файлов
Класс ofstream предназначен для вывода данных из файлового потока. Далее перечислены основные методы данного класса.
| Метод | Описание |
| open | Открывает файл для записи |
| put | Записывает одиночный символ в файл |
| write | Записывает заданное число байт из памяти в файл |
| seekp | Перемещает указатель позиционирования в указанное положение |
| tellp | Возвращает текущее значение указателя позиционирования файла |
| close | Закрывает файл |
Описанный ранее оператор включения удобен для организации записи в текстовый файл:
Бинарные файлы
В принципе, бинарные данные обслуживаются наподобие текстовых. Отличие состоит в том, что если бинарные данные записываются в определенной логической структуре, то они должны считываться из файла в переменную того же структурного типа.
Первый параметр методов write и read (адрес блока записи/чтения) должен иметь тип символьного указателя char * , поэтому необходимо произвести явное преобразование типа адреса структуры void * . Второй параметр указывает, что бинарные блоки файла имеют постоянный размер байтов независимо от фактической длины записи. Следующее приложение дает пример создания и отображения данных простейшей записной книжки. Затем записи файла последовательно считываются и отображаются на консоли.
P.S. При выполнении этого и других листингов в Visual Studio последних версий может дополнительно понадобиться подключение директивы _CRT_SECURE_NO_WARNINGS.
В результате выполнения этого кода образуется бинарный файл Notebook.dat из трех блоков размером по 80 байт каждый (при условии, что символы — однобайтовые). Естественно, вы можете использовать другие поточные методы и проделывать любые операции над полями определенной структуры данных.
Класс fstream: произвольный доступ к файлу
Предположим что в нашей записной книжке накопилось 100 записей, а мы хотим считать 50-ю. Конечно, можно организовать цикл и прочитать все записи с первой по заданную. Очевидно, что более целенаправленное решение — установить указатель позиционирования файла pos прямо на запись 50 и считать ее:
Подобные операции поиска эффективны, если файл состоит из записей известного и постоянного размера. Чтобы заменить содержимое произвольной записи, надо открыть поток вывода в режиме модификации:
Если не указать флаг ios::ate (или ios::app ), то при открытии бинарного файла Notebook.dat его предыдущее содержимое будет стерто!
Дополнительно может понадобиться указать, откуда отсчитывается смещение.
Наконец, можно открыть файл одновременно для чтения/записи, используя методы, унаследованные поточным классом fstream от своих предшественников. Поскольку класс fstream произведен от istream и ostream (родителей ifstream и ofstream соответственно), все упомянутые ранее методы становятся доступными в приложении.
Ofstream c что это
Для работы с файлами в стандартной библиотеке определен заголовочный файл fstream , который определяет базовые типы для чтения и записи файлов. В частности, это:
ifstream : для чтения с файла
ofstream : для записи в файл
fstream : совмещает запись и чтение
Для работы с данными типа wchar_t для этих потоков определены двойники:
Открытие файла
При операциях с файлом вначале необходимо открыть файл с помощью функции open() . Данная функция имеет две версии:
Для открытия файла в функцию необходимо передать путь к файлу в виде строки. И также можно указать режим открытия. Список доступных режимов открытия файла:
ios::in : файл открывается для ввода (чтения). Может быть установлен только для объекта ifstream или fstream
ios::out : файл открывается для вывода (записи). При этом старые данные удаляются. Может быть установлен только для объекта ofstream или fstream
ios::app : файл открывается для дозаписи. Старые данные не удаляются.
ios::ate : после открытия файла перемещает указатель в конец файла
ios::trunc : файл усекается при открытии. Может быть установлен, если также установлен режим out
ios::binary : файл открывается в бинарном режиме
Если при открытии режим не указан, то по умолчанию для объектов ofstream применяется режим ios::out , а для объектов ifstream — режим ios::in . Для объектов fstream совмещаются режимы ios::out и ios::in .
Однако в принципе необязательно использовать функцию open для открытия файла. В качестве альтернативы можно также использовать конструктор объектов-потоков и передавать в них путь к файлу и режим открытия:
При вызове конструктора, в который передан путь к файлу, данный файл будет автоматически открываться:
Вообще использование конструкторов для открытия потока является более предпочтительным, так как определение переменной, представляющей файловой поток, уже преполагает, что этот поток будет открыт для чтения или записи. А использование конструктора избавит от ситуации, когда мы забудем открыть поток, но при этом начнем его использовать.
В процессе работы мы можем проверить, окрыт ли файл с помощью функции is_open() . Если файл открыт, то она возвращает true:
Закрытие файла
После завершения работы с файлом его следует закрыть с помощью функции close() . Также стоит отметить, то при выходе объекта потока из области видимости, он удаляется, и у него автоматически вызывается функция close.
Стоит отметить, что при компиляции через g++ следует использовать флаг -static , если программа работает со файлами и использует типы из заголовочного файла fstream:
Класс basic_ofstream
Описывает объект, который управляет вставкой элементов и закодированными объектами в буфер потока класса basic_filebuf< Elem, Tr> с элементами типа Elem , признаки символов которых определяются классом Tr . Для получения дополнительной информации см. basic_filebuf .
Синтаксис
Параметры
Elem
Базовый элемент буфера файла.
Tr
Признаки базового элемента буфера файлов (обычно char_traits<Elem> ).
Remarks
wchar_t При специализации basic_ofstream записи в файл, если файл открыт в текстовом режиме, он записывает последовательность MBCS. Внутреннее представление будет использовать буфер символов wchar_t .
Объект сохраняет объект класса basic_filebuf< Elem, Tr> .
Пример
В следующем примере показано создание объекта basic_ofstream и запись в него текста.
Конструкторы
| Конструктор | Описание |
|---|---|
| basic_ofstream | Создает объект типа basic_ofstream . |
Функции элементов
| Функция-член | Описание |
|---|---|
| close | Закрывает файл. |
| is_open | Определяет, открыт ли файл. |
| open | Открывает файл. |
| rdbuf | Возвращает адрес сохраненного буфера потока. |
| swap | Меняет местами содержимое этого объекта basic_ofstream с содержимым указанного объекта basic_ofstream . |
Операторы
| Оператор | Описание |
|---|---|
| operator= | Назначает содержимое этого объекта потока. Это назначение перемещения, включающее в rvalue reference себя, которое не оставляет копию позади. |
Требования
Заголовка: <fstream>
Пространство имен: std
basic_ofstream::basic_ofstream
Создает объект типа basic_ofstream .
Параметры
_Filename
Имя файла, который необходимо открыть.
_Prot
Защита открытия файла по умолчанию, эквивалентная параметру shflag в _fsopen _wfsopen , .
right
Ссылка rvalue на объект basic_ofstream , используемый для инициализации этого объекта basic_ofstream .
Remarks
Первый конструктор инициализирует базовый класс путем вызова basic_ostream(sb) , где sb находится сохраненный объект класса basic_filebuf< Elem, Tr> . Он также инициализируется sb путем вызова basic_filebuf Elem <, . Tr >
Второй и третий конструкторы инициализируют базовый класс путем вызова basic_ostream( sb) . Он также инициализируется sb путем вызова< Elem basic_filebuf , Tr > а затем . sb.open( _Filename, _Mode | ios_base::out) Если последняя функция возвращает NULL указатель, конструктор вызывает setstate(failbit) .
Четвертый конструктор является функцией копирования. Он инициализирует объект с содержимым right , что рассматривается как ссылка rvalue.
Дополнительные сведения см. в разделах basic_ostream , open и setstate .
Пример
В следующем примере показано создание объекта basic_ofstream и запись в него текста.
basic_ofstream::close
Remarks
Вызовы rdbuf->close функции-члена. Дополнительные сведения см. в разделах rdbuf и close .
Пример
См basic_filebuf::close . пример, в который используется close .
basic_ofstream::is_open
Указывает, открыт ли файл.
Возвращаемое значение
Значение true , если файл открыт; в противном случае — значение false .
Remarks
Функция-член возвращает значение rdbuf->is_open . Дополнительные сведения см. в разделах rdbuf и is_open .
Пример
basic_ofstream::open
Параметры
_Filename
Имя файла, который необходимо открыть.
_Prot
Защита открытия файла по умолчанию, эквивалентная параметру shflag в _fsopen _wfsopen , .
Remarks
Вызовы rdbuf -> open(_ Filename, _Mode | ios_base::out) функции-члена. Если эта функция возвращает NULL указатель, функция вызывает setstate(failbit) .
Дополнительные сведения см. в разделах rdbuf , open и setstate .
Пример
См basic_filebuf::open . пример, в который используется open .
basic_ofstream::operator=
Назначает содержимое этого объекта потока. Это назначение перемещения, включающее в rvalue reference себя, которое не оставляет копию позади.
Параметры
right
Ссылка rvalue на объект basic_ofstream .
Возвращаемое значение
Возвращает *this .
Remarks
Оператор-член заменяет содержимое объекта при помощи содержимого right , которое обрабатывается как ссылка rvalue.
basic_ofstream::rdbuf
Возвращает адрес сохраненного буфера потока.
Возвращаемое значение
Возвращает адрес сохраненного буфера потока.
Пример
См basic_filebuf::close . пример, в который используется rdbuf .
basic_ofstream::swap
Меняет местами содержимое двух объектов basic_ofstream .
Параметры
right
Ссылка lvalue на другой объект basic_ofstream .
Remarks
Функция-член меняет местами содержимое этого объекта для содержимого right .