22 мая 2007 г.

Простой пример файлового ввода-вывода

Ну, поглядим, как это все работает. Допустим нам надо вывести числа, хранящиеся в векторе, в файл через пробелы – достаточно распространенная задача. Для этого можно написать примерно такую функцию:
#include <fstream>
#include <string>
#include <vector>
#include <iostream>
using namespace std;
int output(vector<int> &values, string filename)
{
ofstream ofile(filename.c_str());
if (!ofile)
{
cerr << "Error opening file!" << endl;
return -1;
}
for (int i = 0; i < values.size(); ++i)
ofile << values[i] << ' ';
ofile.close();
return 0;
}

На мой взгляд, код достаточно очевидный, чтобы его объяснять построчно. Обращу внимание только на то, что вывод в файл (ofile << values[i] << ' ';) и вывод в стандартный поток ошибок (cerr << "Error opening file!" << endl;) выполняются одинаково, с помощью переопределенного оператора << . А таинственный cerr (наряду с cout и clog) – это всего лишь объект класса ostream, определенный в файле iostream; работает он точно так же, как и созданный нами собственноручно ofile (ну, вообще-то, работает не совсем так же, но тонкости рассмотрим позже).
Справедливости ради создадим функцию, которая выполняет обратное действие – считывает последовательность чисел из файла:
int input(vector<int> &values, string filename)
{
ifstream ifile(filename.c_str());
if (!ifile)
{
cerr << "Error opening file!" << endl;
return -1;
}
int v;
while (!ifile.eof())
{
ifile >> v;
values.push_back(v);
}
ifile.close();
return 0;
}

Объект потока не обязательно должен лежать на стеке, возможны всевозможные варианты:
// можно так (на стеке)
ifstream ifile;
ifile.open(filename.c_str());
// а можно и так (в куче)
ifstream *ifile = new ifstream;
ifile->open(filename.c_str());
// можно даже так
ifstream *ifile = new ifstream(filename.c_str());

Домашнее задание: замените ofstream на ostrstream, ifstream на istrstream, а имя файла - на адрес char-строки. Убедитесь, что ввод-вывод на символьных строках выполняется точно так же, как и файловый.

3 комментария:

Анонимный комментирует...

проверка

Анонимный комментирует...

Флегматик, почему вы больше ничего не пишете?

Flegmatic комментирует...

Забросил. Теперь пишу на http://typedef.ru