Программирование. Принципы и практика использования C++ Исправленное издание, стр. 140

Чаще всего мы предполагаем, что байты на диске являются символами из обычного набора символов. Это не всегда так, но, поскольку другие представления обработать несложно, мы, как правило, будем придерживаться этого предположения. Кроме того, будем считать, что все файлы находятся на дисках (т.е. на вращающихся магнитных устройствах хранения данных). И опять-таки это не всегда так (вспомните о флэш-памяти), но на данном уровне программирования фактическое устройство хранения не имеет значения. Это одно из главных преимущество абстракций файла и потока.
Для того чтобы прочитать файл, мы должны
• знать его имя;
• открыть его (для чтения);
• считать символы;
• закрыть файл (хотя это обычно выполняется неявно).
Для того чтобы записать файл, мы должны
• назвать его;
• открыть файл (для записи) или создать новый файл с таким именем;
• записать наши объекты;
• закрыть файл (хотя это обычно выполняется неявно).
Мы уже знаем основы чтения и записи, поскольку во всех рассмотренных нами ситуациях поток
ostreamcoutistreamcinostreamistream10.4. Открытие файла
cout << "Пожалуйста, введите имя файла: ";string name;cin >> name;ifstream ist(name.c_str()); // ist — это поток ввода для файла, // имя которого задано строкой nameif (!ist) error(" Невозможно открыть файл для ввода ",name);
c_str()stringstring!ist>>Pointvector<Point> points;Point p;while (ist>>p) points.push_back(p);Вывод в файлы аналогичным образом можно выполнить с помощью потоков
ofstreamcout << "Пожалуйста, введите имя файла для вывода: ";string oname;cin >> oname;ofstream ost(oname.c_str()); // ost — это поток вывода для файла, // имя которого задано строкой nameif (!ost) error("Невозможно открыть файл вывода ",oname);
ofstreamname!ostostreamfor (int i=0; i<points.size(); ++i) ost << '(' << points[i].x << ',' << points[i].y << ")\n";Когда файловый поток выходит из пределов видимости, связанный с ним файл закрывается. Когда файл закрывается, связанный с ним буфер “очищается” (“flushed”); иначе говоря, символы из буфера записываются в файл.
Как правило, файлы в программе лучше всего открывать как можно раньше, до выполнения каких-либо серьезных вычислений. Помимо всего прочего, было бы слишком расточительным выполнить большую часть работы и обнаружить, что вы не можете ее завершить, потому что вам некуда записать результаты.
Открытие файла неявно является частью процесса создания потоков
ostreamistreamРассмотрим пример.
void fill_from_file(vector<Point>& points, string& name){ ifstream ist(name.c_str()); // открываем файл для чтения if (!ist) error("Невозможно открыть файл для ввода",name); // ...используем поток ist... // файл неявно закроется, когда мы выйдем из функции}
open()close()