Ofstream c что это
Перейти к содержимому

Ofstream c что это

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 .

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *