Перейти к содержимому

Ofstream c что это

  • автор:

Ofstream c что это

Для работы с файлами в стандартной библиотеке определен заголовочный файл fstream , который определяет базовые типы для чтения и записи файлов. В частности, это:

  • ifstream : для чтения с файла
  • ofstream : для записи в файл
  • fstream : совмещает запись и чтение

Для работы с данными типа wchar_t для этих потоков определены двойники:

  • wifstream
  • wofstream
  • wfstream

Открытие файла

При операциях с файлом вначале необходимо открыть файл с помощью функции open() . Данная функция имеет две версии:

  • open(путь)
  • 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 .

std::ofstream out; // поток для записи out.open("hello1.txt"); // окрываем файл для записи std::ofstream out2; out2.open("hello2.txt", std::ios::app); // окрываем файл для дозаписи std::ofstream out3; out2.open("hello3.txt", std::ios::out | std::ios::trunc); // установка нескольких режимов std::ifstream in; // поток для чтения in.open("hello4.txt"); // окрываем файл для чтения std::fstream fs; // поток для чтения-записи fs.open("hello5.txt"); // окрываем файл для чтения-записи

Однако в принципе необязательно использовать функцию open для открытия файла. В качестве альтернативы можно также использовать конструктор объектов-потоков и передавать в них путь к файлу и режим открытия:

fstream(путь) fstream(путь, режим)

При вызове конструктора, в который передан путь к файлу, данный файл будет автоматически открываться:

std::ofstream out("hello.txt"); std::ifstream in("hello.txt"); std::fstream fs("hello.txt", std::ios::app);

В данном случае предполагается, что файл «hello.txt» располагается в той же папке, где и файл программы.

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

В процессе работы мы можем проверить, окрыт ли файл с помощью функции is_open() . Если файл открыт, то она возвращает true:

std::ifstream in; // поток для чтения in.open(«hello.txt»); // окрываем файл для чтения // если файл открыт if (in.is_open())

Закрытие файла

После завершения работы с файлом его следует закрыть с помощью функции close() . Также стоит отметить, то при выходе объекта потока из области видимости, он удаляется, и у него автоматически вызывается функция close.

#include #include int main() < std::ofstream out; // поток для записи out.open("hello.txt"); // окрываем файл для записи out.close(); // закрываем файл std::ifstream in; // поток для чтения in.open("hello.txt"); // окрываем файл для чтения in.close(); // закрываем файл std::fstream fs; // поток для чтения-записи fs.open("hello.txt"); // окрываем файл для чтения-записи fs.close(); // закрываем файл >

Класс basic_ofstream

Описывает объект, который управляет вставкой элементов и закодированными объектами в буфер потока класса basic_filebuf < Elem, Tr>с элементами типа Elem , признаки символов которых определяются классом Tr . Дополнительные сведения см. в разделе basic_filebuf .

Синтаксис

template > class basic_ofstream : public basic_ostream

Параметры

Elem
Базовый элемент буфера файла.

Tr
Признаки базового элемента буфера файла (обычно char_traits ).

Замечания

wchar_t При специализации basic_ofstream записи в файл, если файл открыт в текстовом режиме, он будет записывать последовательность МБ CS. Внутреннее представление будет использовать буфер символов wchar_t .

Объект сохраняет объект класса basic_filebuf < Elem, Tr>.

Пример

В следующем примере показано создание объекта basic_ofstream и запись в него текста.

// basic_ofstream_class.cpp // compile with: /EHsc #include using namespace std; int main(int argc, char **argv) < ofstream ofs("ofstream.txt"); if (!ofs.bad()) < ofs > 

Конструкторы

Конструктор Description
basic_ofstream Создает объект типа basic_ofstream .

Функции элементов

Функция-член Description
close Закрывает файл.
is_open Определяет, открыт ли файл.
open Открывает файл.
rdbuf Возвращает адрес сохраненного буфера потока.
swap Меняет местами содержимое этого объекта basic_ofstream с содержимым указанного объекта basic_ofstream .

Операторы

Operator Description
operator= Назначает содержимое этого объекта потока. Это назначение перемещения, rvalue reference которое не оставляет копию позади.

Требования

Заголовок.

Пространство имен std :

basic_ofstream::basic_ofstream

Создает объект типа basic_ofstream .

basic_ofstream(); explicit basic_ofstream( const char* _Filename, ios_base::openmode _Mode = ios_base::out, int _Prot = (int)ios_base::_Openprot); explicit basic_ofstream( const wchar_t* _Filename, ios_base::openmode _Mode = ios_base::out, int _Prot = (int)ios_base::_Openprot); basic_ofstream( basic_ofstream&& right); 

Параметры

_Filename
Имя файла, который необходимо открыть.

_Prot
Защита от открытия файла по умолчанию, эквивалентная параметру shflag в _fsopen , _wfsopen .

right
Ссылка rvalue на объект basic_ofstream , используемый для инициализации этого объекта basic_ofstream .

Замечания

Первый конструктор инициализирует базовый класс путем вызова basic_ostream(sb) , где sb хранится объект класса basic_filebuf < Elem, Tr>. Он также инициализируется sb путем вызова .> Tr basic_filebuf < Elem

Второй и третий конструкторы инициализировать базовый класс путем вызова 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_ctor.cpp // compile with: /EHsc #include using namespace std; int main(int argc, char **argv) < ofstream ofs("C:\\ofstream.txt"); if (!ofs.bad()) < ofs > 

basic_ofstream::close

void close(); 

Замечания

Вызовы rdbuf->close функции-члены. Дополнительные сведения см. в разделах rdbuf и close .

Пример

Пример basic_filebuf::close использования close .

basic_ofstream::is_open

Указывает, открыт ли файл.

bool is_open() const; 

Возвращаемое значение

Значение true , если файл открыт; в противном случае — значение false .

Замечания

Функция-член возвращает значение rdbuf->is_open . Дополнительные сведения см. в разделах rdbuf и is_open .

Пример

// basic_ofstream_is_open.cpp // compile with: /EHsc #include #include int main( ) < using namespace std; ifstream file; // Open and close with a basic_filebuf file.rdbuf( )->open( "basic_ofstream_is_open.txt", ios::in ); file.close( ); if (file.is_open()) cout

basic_ofstream::open

void open( const char* _Filename, ios_base::openmode _Mode = ios_base::out, int _Prot = (int)ios_base::_Openprot); void open( const char* _Filename, ios_base::openmode _Mode); void open( const wchar_t* _Filename, ios_base::openmode _Mode = ios_base::out, int _Prot = (int)ios_base::_Openprot); void open( const wchar_t* _Filename, ios_base::openmode _Mode); 

Параметры

_Filename
Имя файла, который необходимо открыть.

_Prot
Защита от открытия файла по умолчанию, эквивалентная параметру shflag в _fsopen , _wfsopen .

Замечания

Вызовы rdbuf -> open(_ Filename, _Mode | ios_base::out) функции-члены. Если эта функция возвращает NULL указатель, функция вызывается setstate(failbit) .

Дополнительные сведения см. в статьях rdbuf , open и setstate .

Пример

Пример basic_filebuf::open использования open .

basic_ofstream::operator=

Назначает содержимое этого объекта потока. Это назначение перемещения, rvalue reference которое не оставляет копию позади.

basic_ofstream& operator=(basic_ofstream&& right); 

Параметры

right
Ссылка rvalue на объект basic_ofstream .

Возвращаемое значение

Возвращает *this .

Замечания

Оператор-член заменяет содержимое объекта при помощи содержимого right , которое обрабатывается как ссылка rvalue.

basic_ofstream::rdbuf

Возвращает адрес сохраненного буфера потока.

basic_filebuf *rdbuf() const 

Возвращаемое значение

Возвращает адрес сохраненного буфера потока.

Пример

Пример basic_filebuf::close использования rdbuf .

basic_ofstream::swap

Меняет местами содержимое двух объектов basic_ofstream .

void swap(basic_ofstream& right); 

Параметры

right
Ссылка lvalue на другой объект basic_ofstream .

Замечания

Функция-член меняет местами содержимое этого объекта для содержимого right .

Функции-члены потока выходного файла

Функции-члены потока вывода делятся на три типа: эквивалентные манипуляторам, выполняющие неформатированные операции записи и изменяющие состояние потока другим образом и при этом не имеющие эквивалентных манипуляторов или операторов вставки. Для последовательного форматированного вывода можно использовать только операторы вставки и манипуляторы. Для двоичного дискового вывода с произвольным доступом следует использовать другие функции-члены с операторами вставки или без них.

Функция open для потоков вывода

Чтобы использовать выходной поток файлов ( ofstream ), необходимо связать этот поток с определенным файлом диска в конструкторе или open функции. При использовании open функции можно повторно использовать один и тот же объект потока с рядом файлов. В любом случае аргументы, описывающие файл, одни и те же.

При открытии файла, связанного с выходным потоком, обычно указывается open_mode флаг. Эти флаги можно объединить, которые определяются как перечислители в ios классе, с побитовой оператором OR ( | ). См ios_base::openmode . список перечислителей.

Три типовые ситуации для потока вывода используют параметры режима:

    Создание файла. Если файл уже существует, старая версия удаляется.

ofstream ofile("FILENAME"); // Default is ios::out ofstream ofile("FILENAME", ios::out); // Equivalent to above 
ofstream ofile("FILENAME", ios::app); 
ofstream ofile(); ofile.open("FILE1", ios::in); // Do some output ofile.close(); // FILE1 closed ofile.open("FILE2", ios::in); // Do some more output ofile.close(); // FILE2 closed // When ofile goes out of scope it is destroyed. 

Функция put .

Функция put записывает один символ в выходной поток. Следующие две конструкции по умолчанию одинаковы, но вторая зависит от аргументов формата потока:

cout.put('A'); // Exactly one character written cout  

Функция write .

Функция write записывает блок памяти в выходной поток файлов. Аргумент length указывает количество записанных байт. Следующий пример создает файловый поток вывода и записывает в него двоичное значение структуры Date :

// write_function.cpp // compile with: /EHsc #include using namespace std; struct Date < int mo, da, yr; >; int main( ) < Date dt = < 6, 10, 92 >; ofstream tfile( "date.dat" , ios::binary ); tfile.write( (char *) &dt, sizeof dt ); > 

Функция write не останавливается, когда она достигает символа NULL , поэтому записывается полная структура класса. Функция имеет два аргумента: указатель char и количество символов для записи. Обратите внимание на обязательный приведение char * к адресу объекта структуры.

Функции seekp и tellp

Файловый поток вывода хранит внутренний указатель на позицию следующей записи данных. Функция-член seekp устанавливает этот указатель, предоставляя тем самым вывод произвольного доступа в дисковый файл. Функция-член tellp возвращает позицию в файле. Примеры, которые используют входной поток, эквиваленты seekp и tellp см. в разделе "Функции seekg и tellg функции".

Функция close для потоков вывода

Функция-член close закрывает файл диска, связанный с потоком выходных файлов. Для завершения всех операций вывода на диск файл должен быть закрыт. При необходимости ofstream деструктор закрывает файл, но можно использовать close функцию, если нужно открыть другой файл для одного объекта потока.

Деструктор выходного потока автоматически закрывает файл потока, только если конструктор или open функция-член открыли файл. Если вы передаете конструктор дескриптор файла для уже открытого файла или используете attach функцию-член, необходимо явно закрыть файл.

Функции обработки ошибок

Используйте эти функции-члены для проверки на ошибки при записи в поток:

Функция Возвращаемое значение
bad Возвращается, если возникает true неустранимая ошибка.
fail Возвращается, если возникает true неустранимая ошибка или ожидаемое условие, например ошибка преобразования, или если файл не найден. Обработка часто возобновляется после вызова clear с нулевым аргументом.
good Возвращается true , если не удается установить условие ошибки (неустранимое или другое) и флаг конца файла не задан.
eof Возвращает состояние true конца файла.
clear Устанавливает внутреннее состояние ошибки. Если вызывается с аргументами по умолчанию, он очищает все биты ошибок.
[ rdstate ](basic-ios-class.md#rdstate Возвращает текущее состояние ошибки.

Оператор ! перегружен для выполнения той же функции, что fail и функция. Таким образом выражение:

if(!cout). 
if(cout.fail()). 

Оператор void*() перегружается в противоположность оператору ! . Таким образом, выражение:

if(cout). 
if(!cout.fail()). 

Оператор void*() не эквивалентен good , так как он не проверяет конец файла.

Файловый ввод-вывод в C++

В языке C++ ввод-вывод осуществляется через объекты классов ifstream (для чтения данных) и ofstream (для вывода данных). Эти классы объявлены в заголовочном файле fstream .

При создании этих объектов нужно передать в конструктор один параметр - имя файла.

После этого с этими объектами можно работать точно так же, как с объектами cin и сout .

После окончания работы с файлами, файлы нужно "закрыть" эти объекты, вызвав для них метод close() .

Приведем пример программы, которая считывает два числа из файла с именем input.txt и выводит результат в файл output.txt .

#include
using namespace std;

int main()
ifstream fin("input.txt");
ofstream fout("output.txt");
int a, b;
fin >> a >> b;
fout fin.close();
fout.close();
>

Аналогично для считывания строки до символа конца строки из файла можно использовать функцию getline с двумя параметрами - файловый объект, из которого читаются данные и строка, куда записывается результат. Например:

Для проверки состояния файла можно использовать метод файла eof() . Он возвращает значение true или false в зависимости от того, был ли обнаружен конец файла при чтении:

Но при использовании этого метода могут возникнуть затруднения, например, с тем, что если после последнего числа в файле стоит символ конца строки, то состояние "достигнут конец файла" произойдет не после чтения последнего числа, а после следующего чтения.

Более надежный (и простой!) способ считать последовательность чисел из файла до конца файла -- использование значения, возвращаемого при считывании:

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

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