клас ofstream
зворотний класу ifstream, який ми розглянули раніше, і покликаний для запису в файл.
Як і в ifstream, для відкриття або створення файлу використовується конструктор або метод ВІДЧИНЕНО().
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::додаток вказується, якщо потрібно дописувати в кінець вже наявного файлу. Наприклад коли програма веде лог своєї роботи
За перевірку на відкритість файлу відповідає все та ж 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; |
Призначений для виведення в текстові файли. Управляється операціями форматування такими як ширина() или SETF(). Їх аналоги повністю рівні однойменною методам з iostream.
Послідовність виведення змінних так само вказується зліва на право: Першою буде виведена змінна, вказана ближче всіх до філе, потім наступна за нею.
оператор 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 для речового).
Ще раз варто акцентувати, що на відміну від форматированного виведення оператором <<, метод запис() не виводить дані в текстовому поданні.
метод близько
Закриває файл метод близько(). для файлів, відкритих на запис, на відміну від файлів на читання, закриття файлу – обов'язковий ритуал. Незакритий файл може не отримати дані. Відбуватися такий ефект може через буфферізаціі самої операційки, коли дані, скидаються в файл, зберігаються насправді в пам'яті і відразу в файл не надходять. Операційна система сама вирішує, коли пора дані зливати.
такий “відкладений” слив називається “коммітов” (від латинського commit). До речі цим ефектом вельми вдало користуються системи управління базами даних, де вставляються записи потрапляють в сховище в пам'яті (званої транзакцією). І тільки після спеціальної команди скопом пишуться в сам файл бази. метод близько() якраз приклад такої команди закриває транзакцію разом з файлом.
Варто про всяк випадок згадати, що якщо потрібно зробити Комміт даних без закриття самого файлу, потрібно застосувати метод врівень()
1 | fileo.flush(); |
Відкладені на запис дані надійдуть в файл, але він ще буде відкритий для запису. Цей метод не так часто використовується, але про нього знати корисно.
Методи форматування width, точність
як і в iostream, для красивої розмітки даних в файлі можуть застосовуватися методи форматування даних для виведення оператором << .
ширина() вказує ширину в символах, в яке буде укладатися виведене значення, а точність() кількість знаків дробової частини речового. найпростіший приклад: висновок таблицею в текстовий файл значень тригонометричної функції:
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().
Відео про роботу з файлами в С ++:
Написав я програму, яка виводить в текстовий файл яку потрібну інформацію, яку потім можна скопіювати і вставити в МАТЛАБ, щоб побудувати графік. Я вирішив так зробити, тому що для Visual Studio у мене стоїть дуже потрібне розширення, а намагатися шукати в інеті інфу про те, як будувати графіки в VS на C ++ мені лінь. Ось я протестував вийшла програму і бачу, що файлі у мене відобразилася тільки останній рядок. Коли я закоментувавши ту частину коду, яка виводить цей рядок, у мене не вивелося нічого. коротше, або я тупий, або автор статті щось не дописав.
(Доповнення до попереднього коментарю) Під час відкриття файлу, в який все це друкується, я також, як і на прикладі в цій статті, написав “ios_base::додаток”.
Якщо закомментировать "ios_base::додаток ", то результат буде такий же, ось тільки перед цією ж самою рядком буде величезна купа прогалин ахахахах
char* str1 = “Здравствуйте”;
char* str2 = “світ!”;
int main() {
файл ifstream(“file.txt);
if (!file.is_open) {
std::Palau << "Cannot open the file" << std::endl;
return 1;
}
файл << str1 << ", " << str2 << std::endl;
file.close();
return 0;
}