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

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

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

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

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

Функция Возвращаемое значение
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 , так как он не проверяет конец файла.

См. также

Потоки вывода