Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
О.О.П / ооп / 4_кол / Лекції / ООП (16. Робота з потоками).doc
Скачиваний:
23
Добавлен:
30.05.2020
Размер:
240.13 Кб
Скачать

Лістинг 16. Відкриття файлу для читання і запису

1: #include <fstream.h>

2: int main()

3: {

4:    char fileName[80];

5:    char buffer[255]; // для введення даних користувачем

6:    cout << "fileName: ";

7:    cin >> fileName;

8:

9:    ofstream fout(fileName); // відкриття файлу для запису

10:   fout << "This line written directly to the file...\n";

11:   cout << "Enter text for the file: ";

12:   cin.ignore(1,'\n'); // пропускає символ розриву рядка після імені файлу

13:   cin.getline(buffer,255); // приймає дані, введені користувачем,

14:   fout << buffer << "\n"; // і записує їх у файл

15:   fout.close(); // закриває файл, після чого його знов можна відкрити

16:

17:   ifstream fin(fileName); // відкривається той же файл для читання

18:   cout << "Here's the contents of the file:\n";

19:   char ch;

20:   while (fin.get(ch))

21:   cout << ch;

22:

23:   cout << "\n*** End of file contents.***\n";

24:

25:   fin.close(); // не забути закрити файл в кінці програми

26:   return 0;

27: }

Результат:

File name: test1

Enter text for the file: This text is written to the file!

Here's the contents of the file: This line written directly to the file...

This text is written to the file!

***End of file contents.***

Аналіз: У рядку 4 створюється масив для запису імені файлу, а в рядку 5 — ще один масив для тимчасового зберігання інформації, що вводиться користувачем. У рядку 6 користувачеві пропонується ввести ім'я файлу, яке записується в масив fileName. У рядку 9 створюється об'єкт ofstream з ім'ям fout, який зв'язується з введеним раніше ім'ям файлу. В результаті відбувається відкриття файлу. Якщо файл з таким ім'ям вже існує, інформація, що міститься в нім, буде заміщена.

Рядком 10 введений текст записується прямо у файл, а в рядку 11 користувачеві знов пропонується ввести новий текст. Символ розриву рядка, що залишився в буфері після введення імені файлу, віддаляється рядком 12, після чого всі введені користувачем дані записуються в масив в рядку 13. Введений текст записується у файл разом з символом розриву рядка, а потім в рядку 15 цей файл закривається.

У рядку 17 файл відкривається заново, але на цей раз для читання, і його вміст посимвольний вводиться в програму в рядках 20—21.

Налаштування відкриття файлу об'єктом ofstream

За умовчанням при пов'язанні об'єкту ofstream з ім'ям файлу створюється новий файл з вказаним ім'ям, якщо такий не існує, або віддаляється вміст вже існуючого файлу з таким же ім'ям. Аби змінити установки за умовчанням, використовується другий аргумент конструктора об'єкту ofstream.

Для другого аргументу можна встановлювати наступні константні значення:

• ios::app — додає дані в кінець файлу замість видалення всього вмісту файлу;

• ios::ate — переводить точку введення в кінець файлу, але у вас є можливість вводити нові дані в будь-якому місці файлу;

• ios::trunc — встановлюється за умовчанням; повністю видаляє (відкидає) поточний вміст файлу;

• ios::nocreate — якщо файл не існує, операція відкриття не виконується;

• ios::noreplace — якщо файл вже існує, операція відкриття не виконується.

Імена констант є абревіатурами виконуваних дій: app — apend (додати), ate — at end (у кінець), trunc — truncate (відкинути) і тому подібне

Лістинг 17 є модифікацією лістингу 16 з установкою опції додавання даних у файл при його повторному відкритті.