//
for (auto p = argv + 1; p != argv + argc; ++p) {
ifstream input(*p); //
if (input) { //
process(input);
} else
cerr << "couldn't open: " + string(*p);
} //
При каждой итерации создается новый объект класса ifstream по имени input и открывается файл для чтения. Как обычно, проверяется успех вызова функции open(). Если все в порядке, этот файл передается функции, которая будет читать и обрабатывать ввод. В противном случае выводится сообщение об ошибке.
Поскольку объект input является локальным для цикла while, он создается и удаляется при каждой итерации (см. раздел 5.4.1). Когда объект fstream выходит из области видимости, файл, к которому он привязан, автоматически закрывается. На следующей итерации объект input создается снова.
fstream удаляется, автоматически вызывается функция close().
Упражнение 8.4. Напишите функцию, которая открывает файл и читает его содержимое в вектор строк, сохраняя каждую строку как отдельный элемент вектора.
Упражнение 8.5. Перепишите предыдущую программу так, чтобы каждое слово сохранялось в отдельном элементе.
Упражнение 8.6. Перепишите программу книжного магазина из раздела 7.1.1 так, чтобы читать транзакции из файла. Передавайте имя файла как аргумент функции main() (см. раздел 6.2.5).
Каждый поток обладает
Таблица 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:
//
ofstream out("file1"); //
ofstream out2("file1", ofstream::out); //
ofstream out3("file1", ofstream::out | ofstream::trunc);