Вход/Регистрация
Программирование. Принципы и практика использования C++ Исправленное издание
вернуться

Страуструп Бьерн

Шрифт:

// имя которого задано строкой name

if (!ost) error("Невозможно открыть файл вывода ",oname);

Определение потока
ofstream
с именем, заданным строкой
name
, открывает файл с этим именем для чтения. Проверка
!ost
позволяет выяснить, был ли файл открыт корректно. После этого можно записывать данные в файл точно так же, как в любой другой поток
ostream
. Рассмотрим пример.

for (int i=0; i<points.size; ++i)

ost << '(' << points[i].x << ',' << points[i].y << ")\n";

Когда файловый поток выходит из пределов видимости, связанный с ним файл закрывается. Когда файл закрывается, связанный с ним буфер “очищается” (“flushed”); иначе говоря, символы из буфера записываются в файл.

Как правило, файлы в программе лучше всего открывать как можно раньше, до выполнения каких-либо серьезных вычислений. Помимо всего прочего, было бы слишком расточительным выполнить большую часть работы и обнаружить, что вы не можете ее завершить, потому что вам некуда записать результаты.

Открытие файла неявно является частью процесса создания потоков

ostream
и
istream
. В идеале при закрытии файла следует полагаться на его область видимости.

Рассмотрим пример.

void fill_from_file(vector<Point>& points, string& name)

{

ifstream ist(name.c_str); // открываем файл для чтения

if (!ist) error("Невозможно открыть файл для ввода",name);

// ...используем поток ist...

// файл неявно закроется, когда мы выйдем из функции

}

Кроме того, можно явно выполнить операции
open
и
close
(раздел B.7.1). Однако ориентация на область видимости минимизирует шансы того, что вы попытаетесь использовать файловый поток до того, как файл будет связан с потоком, или после того, как он был закрыт. Рассмотрим пример.

ifstream ifs;

// ...

ifs >> foo; // не выполнено: для потока its не открыт ни один файл

// ...

ifs.open(name,ios_base::in); // открываем файл, имя которого задано

// строкой name

// ...

ifs.close; // закрываем файл

// ...

ifs >> bar; // невыполнено: файл, связанный с потоком ifs, закрыт

// ...

В реальной программе возникающие проблемы, как правило, намного труднее. К счастью, мы не можем открыть файловый поток во второй раз, предварительно его не закрыв. Рассмотрим пример.

fstream fs;

fs.open("foo", ios_base::in); // открываем файл для ввода

// пропущена функция close

fs.open("foo", ios_base::out); // невыполнено: поток ifs уже открыт

if (!fs) error("невозможно");

Не забывайте проверять поток после его открытия.

Почему допускается явное использование функций

open
и
close
? Дело в том, что иногда время жизни соединения с файлом не ограничивается его областью видимости. Однако это событие происходит так редко, что о нем можно не беспокоиться. Более важно то, что такой код можно встретить в программах, в которых используются стили и идиомы языков и библиотек, отличающихся от стилей и идиом, используемых в потоках
iostream
(и в остальной части стандартной библиотеки C++).

Как будет показано в главе 11, о файлах можно сказать намного больше, но сейчас нам достаточно того, что их можно использовать в качестве источников и адресатов данных. Это позволяет нам писать программы, которые были бы нереалистичными, если бы предложили пользователю непосредственно вводить с клавиатуры всю входную информацию. С точки зрения программиста большое преимущество файла заключается в том, что мы можем снова прочитать его в процессе отладки, пока программа не заработает правильно.

  • Читать дальше
  • 1
  • ...
  • 157
  • 158
  • 159
  • 160
  • 161
  • 162
  • 163
  • 164
  • 165
  • 166
  • 167
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

Подпишитесь на рассылку: