Шаблон класса if stream позволяет работать с
файловыми потоками и производить ввод объектов
произвольного типа. Удобно вводить объекты прямо
в контейнер. Специальный итератор (istream_iterator)
помогает в этом случае воспользоваться
алгоритмами (например, сору). При достижении
конца потока (end of stream) итератор принимает
специальное значение, которое служит барьером
выхода за пределы потока (past-the-end iterator).
В примере, приведенном ниже, используется еще
один тип итератора (back_insert_iterator). Он
является адаптером, позволяющим вставлять
элементы в конец последовательности. Если
использовать прямой inserter, то при чтении из
файла последовательность будет реверсирована
(перевернута). Позиционирование в потоке
осуществляется с помощью метода seekg, техника
использования которого также демонстрируется в
примере:
void
main ()
{
//==========
Вектор строк
vector<string> v;
v.push_back("Something in the way ");
v.push_back("it
works distracts me ");
v.push_back("like
no other matter");
pr(v,"Before
writing to file");
//==========
Запрашиваем имя файла
cout « "\nEnter
File Name: ";
string fn, text; cin » fn;
//========== Приписываем расширение
int
pos = fn.rfind(".");
if
(pos > 0)
fn.erase(pos);
fn += ".txt";
//========== Создаем и открываем поток
ofstream
os(fn.c_str());
//==========
Определяем входной и выходной потоки
typedef
istream_iterator<string,
char,
char_traits<char> >
Strln;
typedef
ostream_iterator<string,
char,
char_traits<char> >
StrOut;
//========== Копируем контейнер в выходной поток
copy (v.begin(), v.end(), StrOut(os,"\n"));
os.close();
//========== Открываем файл для чтения
if
stream is(fn.c_str());
//=========
Пропуск
17
символов
is.seekg(17) ;
is » text;
cout
« "\n\nStream Positioning:\n\n" « "17
bytes:\t\t" « text « endl;
//========== Устанавливаем в начало потока
is.seekg(0, ios_base::beg);
is » text;
cout
« "0 bytes:\t\t" « text « endl;
//========== Сдвигаем на 8 символов от конца
is.seekg(-8,
ios_base::end);
is » text;
cout « "-8 bytes
from end:\t" « text « "\n\n";
//========== Устанавливаем в начало потока
is.seekg(0,
ios_base::beg);
v.clear () ;
//==========
Копируем в контейнер
copy(Strln(is),Strln(),back_inserter(v));
pr(v,"After reading
from file");
cout«"\n\n"; }
Программа производит следующий выход:
Before writing to file # Sequence:
1. Something in the way
2. it works distracts me
3. like no other matter
Enter File Name: test
Stream Positioning:
17 bytes: way
0 bytes: Something
-8 bytes from end: matter
After reading from file # Sequence:
1. Something
2. in
3. the
4. way
5. it
6. works
7. distracts
8. me
9. like
10. no
11. other
12. matter |