Освой самостоятельно С++ за 21 день.
Шрифт:
Очень важным методом, используемым в файловых потоках, является функция-член close. Каждый создаваемый вами объект файлового потока открывает файл для чтения или записи (или и для того и другого сразу). По завершении работы файл необходимо закрыть с помощью функции close, чтобы впоследствии не повредить его и записанные в нем данные.
После связывания объектов потока с соответствующими файлами их можно использовать так же, как остальные объекты ввода-вывода. Пример использования
Листинг 16.16. Открытие файла для чтения и записи
1: #include <fstream.h>
2: int main
3: {
4: char fileName[80];
5: char buffer[255]; // для ввода данных пользователем
6: cout << "File паше: ";
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 (отбросить) и т.п.
Листинг 16.17 является модификацией листинга 16.16 с установкой опции добавления данных в файл при его повторном открытии.
Листинг 16.17. Добавление данных в конец файла
1: #include <fstream.h>
2: int main // возвращает 1 в случае ошибки
3: {
4: char fileName[80];
5: char buffer[255];
6: cout << "Please re-enter the file name: ";
7: cin >> fileName;
8:
9: ifstream fin(fileName);
10: if (fin) // файл уже существует?
11: {
12: cout << "Current file contents:\n";
13: char ch;
14: while (fin.get(ch))
15: cout << ch;
16: cout << "\n***End of file contents.***\n";
17: }
18: fin.close;
19:
20: cout << "\nOpening " << fileName << " in append mode...\n";
21:
22: ofstream fout(fileName,ios::app);
23: if (!fout)