8.2.2. Режимы файла
Каждый поток обладает режимом файла (file mode), определяющим возможный способ использования файла. Список режимов файла и их значений приведен в табл. 8.4.
Таблица 8.4. Режимы файла
in Открывает файл для ввода out Открывает файл для вывода app Переходит в конец файла перед каждой записью ate Переходит в конец файла непосредственно после открытия trunc Усекает существующий поток при открытии binary Осуществляет операции ввода-вывода в бинарном режимеРежим файла можно указать при каждом открытии файла, будь то вызов функции open() или косвенное открытие файла при инициализации потока именем файла. У режимов, которые можно задать, есть ряд ограничений.
• Режим out может быть установлен только для объектов типа ofstream или fstream.
• Режим in может быть установлен только для объектов типа ifstream или fstream.
• Режим trunc может быть установлен, только если устанавливается также режим out.
• Режим app может быть установлен, только если не установлен режим trunc. Если режим app установлен, файл всегда открывается в режиме вывода, даже если это не было указано явно.
• По умолчанию файл, открытый в режиме out, усекается, даже если не задан режим trunc. Чтобы сохранить содержимое файла, открытого в режиме out, необходимо либо задать также режим app, тогда можно будет писать только в конец файла, либо задать также режим in, тогда файл откроется и для ввода, и для вывода. Использование того же файла для ввода и вывода рассматривается в разделе 17.5.3.
• Режимы ate и binary могут быть установлены для объекта файлового потока любого типа и в комбинации с любыми другими режимами.
Для каждого типа файлового потока задан режим файла по умолчанию, который используется в случае, если режим не задан. Файлы, связанные с потоками типа ifstream, открываются в режиме in; файлы, связанные с потоками типа ofstream, открываются в режиме out; а файлы, связанные с потоками типа fstream, открываются в режимах in и out.
Открытие файла в режиме out удаляет существующие данные
По умолчанию при открытии потока типа ofstream содержимое файла удаляется. Единственный способ воспрепятствовать удалению данных файла подразумевает установку режима app:
// file1 усекается в каждом из следующих случаев
ofstream out("file1"); // out и trunc установлены неявно
ofstream out2("file1", ofstream::out); // trunc установлен неявно
ofstream out3("file1", ofstream::out | ofstream::trunc);
// для сохранения содержимого файла следует явно задать режим app
ofstream app("file2", ofstream::app); // out установлен неявно
ofstream app2("file2", ofstream::out | ofstream::app);

Режим файла устанавливается при каждом вызове функции open()
Режим файла некоего потока может изменяться при каждом открытии файла.
ofstream out; // режим файла не установлен
out.open("scratchpad"); // неявно заданы режимы out и trunc
out.close(); // out закрыт, его можно использовать для другого файла
out.open("precious", ofstream::app); // режимы out и app
out.close();
Первый вызов функции open() не задает режим вывода явно; этот файл неявно открывается в режиме out. Как обычно, режим out подразумевает также режим trunc. Поэтому файл scratchpad, расположенный в текущем каталоге, будет усечен. Когда открывается файл precious, задается режим добавления. Все данные остаются в файле, а запись осуществляется в конец файла.
Упражнения раздела 8.2.2
Упражнение 8.7. Пересмотрите программу книжного магазина из предыдущего раздела так, чтобы вывод записывался в файл. Передайте имя этого файла как второй аргумент функции main().
Упражнение 8.8. Пересмотрите программу из предыдущего упражнения так, чтобы добавить ее вывод в заданный файл. Запустите программу для того же выходного файла по крайней мере дважды и удостоверьтесь, что данные сохраняются.