Класс ofstream
Обратный классу ifstream, который мы рассмотрели ранее, и призван для записи в файл.
Как и в ifstream, для открытия или создания файла используется конструктор или метод open().
1 2 3 4 5 6 7 | ofstream fileo; // Создаем файл fileo.open("d:\\1\\Результат.txt"); // Открываем для дописывания fileo.open("d:\\1\\Результат.txt"/*,ios_base::app*/); |
Или конструктором:
1 2 3 4 5 | // Создаем файл ofstream fileo("d:\\1\\Результат.txt"); // Открываем для дописывания ofstream fileo("d:\\1\\Результат.txt",ios_base::app); |
Параметр ios_base::app указывается, если нужно дописывать в конец уже имеющегося файла. Например когда программа ведет лог своей работы
За проверку на открытость файла отвечает все та же is_open()
1 2 3 4 5 6 | if( fileo.is_open() ) cout << "Файл создан" << endl; else { cout << "Файл не создан"; cin.get(); return -1; } |
Принцип тот же. Так же можно проверить открыт ли файл, использовав в логическом выражении саму файловую переменную:
1 | if ( !fileo ) cout << "Файл НЕ создан" << endl; |
Оператор <<
Перенаправляет форматированный вывод в файл. Принцип тот же, что и у аналога из iostream.
1 2 3 4 5 6 | // Запись строкой string s = "Привет мир"; // Вещественное double d = 123.456; fileo << s << endl << d << endl; |
Предназначен для вывода в текстовые файлы. Управляется операциями форматирования такими как width() или setf(). Их аналоги полностью равны одноименным методам из iostream.
Последовательность вывода переменных так же указывается слева на право: Первой будет выведена переменная, указана ближе всех к fileo, потом следующая за ней.
Оператор endl
Аналогично оператору из iostream производит запись перевода каретки на новую строку в текстовых файлах.
Метод write
Используется в бинарных файлах для записи блока памяти (массива байт) в файл как они есть. Любая переменная так же является массивом байт, вернее ее так можно рассматривать. Соответственно этот метод запишет в файл ее машинное представление (тот вид как она выглядит в памяти).
1 2 3 4 5 6 7 8 9 10 11 12 | // Запись побайтно // Строки char *sc = "И еще раз\n"; fileo.write(sc,strlen(sc)); // Целого в машинном представлении int k = 123; fileo.write((char*)&k,sizeof(k)); // Вещественного в машинном представлении double dd = 456.789; fileo.write((char*)&dd,sizeof(dd)); |
Этот метод принимает два параметра: Указатель на блок данных и количество байт, который этот блок занимает. В примере строка занимает strlen() байт, целое sizeof() (которое даст 4 на 32-х битных операционках для целого и 8 для вещественного).
Еще раз стоит акцентировать, что в отличии от форматированного вывода оператором <<, метод write() не выводит данные в текстовом представлении.
Метод close
Закрывает файл метод close(). Для файлов, открытых на запись, в отличии от файлов на чтение, закрытие файла – обязательный ритуал. Незакрытый файл может не получить данные. Происходить такой эффект может из-за буфферизации самой операционки, когда данные, сбрасываемые в файл, хранятся на самом деле в памяти и сразу в файл не поступают. Операционная система сама решает, когда пора данные сливать.
Такой “отложенный” слив называется “Коммитом” (от латинского commit). Кстати этим эффектом весьма удачно пользуются системы управления базами данных, где вставляемые записи попадают в хранилище в памяти (называемой транзакцией). И только после специальной команды скопом пишутся в сам файл базы. Метод close() как раз пример такой команды закрывающей транзакцию вместе с файлом.
Стоит на всякий случай упомянуть, что если нужно произвести коммит данных без закрытия самого файла, нужно применить метод flush()
1 | fileo.flush(); |
Отложенные на запись данные поступят в файл, но он еще будет открыт для записи. Этот метод не так часто используется, но о нем знать полезно.
Методы форматирования width, precision
Как и в iostream, для красивой разметки данных в файле могут применяться методы форматирования данных для вывода оператором << .
width() указывает ширину в символах, в которое будет укладываться выводимое значение, а precision() количество знаков дробной части вещественного. Простейший пример: вывод таблицей в текстовый файл значений тригонометрической функции:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | // Форматирование вывода double d = 1; int i; for ( i = 0; i < 10; i++ ){ d += sin(i/d); // Указываем ширину ячейки для целого и выводим целое fileo.width(20); // Выводим целое fileo << i; // Указываем ширину ячейки для вещественного и // кол-во знаков после запятой максимум fileo.width(20); fileo.precision(5); // выводим вещественное fileo << d; // Переводим каретку на новую строку fileo<<endl; } |
Методы позиционирования seekp, tellp
Для перехода по файлу как и в случае с ifstream существует функция перестановки позиции. Называется она seekp() и получает те же параметры что и описаны выше для seekg().
Для получения текущей позиции в байтах от начала файла используется аналогичная функция tellp().
Видео о работе с файлами в С++:
Ti SAS
и я лох
Cyka
Artem Yzbek
и я узбек и еврей
язнаючтояcyka
огого
И я аграартёмаагра
я андрей