Функции-члены потока выходного файла
Функции-члены потока вывода делятся на три типа: эквивалентные манипуляторам, выполняющие неформатированные операции записи и изменяющие состояние потока другим образом и при этом не имеющие эквивалентных манипуляторов или операторов вставки. Для последовательного форматированного вывода можно использовать только операторы вставки и манипуляторы. Для двоичного дискового вывода с произвольным доступом следует использовать другие функции-члены с операторами вставки или без них.
Функция 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 <<'A'; // Format arguments 'width' and 'fill' apply
Функция write
.
Функция write
записывает блок памяти в выходной поток файлов. Аргумент length указывает количество записанных байт. Следующий пример создает файловый поток вывода и записывает в него двоичное значение структуры Date
:
// write_function.cpp
// compile with: /EHsc
#include <fstream>
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
функцию-член, необходимо явно закрыть файл.
Функции обработки ошибок
Используйте эти функции-члены для проверки на ошибки при записи в поток:
Function | Возвращаемое значение |
---|---|
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
, так как он не проверяет конец файла.