Файлы. Общая концепция организации ввода-вывода данных в С++. Средства класса ios, обеспечивающие точную настройку вывода, страница 24

Объясните почему.

5. Дозапись в бинарный файл

В программе открывается для записи бинарный выходной файл, в который записываются 3 переменные-структуры, и файл закрывается. Затем открывается бинарный входной/выходной файл для дозаписи, в него дозаписываются 2 переменные-структуры, затем указатель файла устанавливается на начало файла, информация считывается из файла и выводится на экран:

#include <fstream.h>

#include <iostream.h>

struct person

     {char name[80];     //имя

        int age;                   //возраст

};

int main()

{   person pers;

    int i;

   fstream file1;

   file1.open("d:/TEST.dat", ios::binary | ios::out); 

   if(!file1) {cout<< "error1"<< endl;

                   return 1;

    }

   for ( i=1; i<=3; i++)

               {cout << "input: name, age" <<endl;

               cin >> pers.name >> pers.age;               

               file1.write (reinterpret_cast<char *>(&pers), sizeof(pers)); 

               }

  file1.close();

fstreamfile;

file.open("d:/TEST.dat",ios::app | ios::binary | ios::in | ios::out); 

 if(!file) {cout<< "error1"<< endl;

              return 1;

}

for (int i=1; i<=2; i++)

               {cout << “input: name, age” <<endl;

 cin >> pers.name >> pers.age;               

               file.write (reinterpret_cast<char *>(&pers), sizeof(pers)); 

               }

file.seekg(0);

while (infile.read (reinterpret_cast<char *>(&pers), sizeof(pers))) 

        cout << pers.name << “  “ <<pers.age << endl;   

 return 0;  

}

Результаты работы программы:

вводим три записи:

qqq  12

wwww22  22

rrr  66

добавляем в режиме дозаписи еще две новые:

input: name, age

llll 1

input: name, age

sss 2

выводим содержимое всего файла:

qqq  12

wwww22  22

rrr  66

llll 1

sss 2

6. Оперделение количества записей в бинарном файле и  корректировка записей

В программе открывается для чтения бинарный файл (созданный в предыдущей программе), в котором записана информация о нескольких персонах, затем указатель файла устанавливается на начало информации о нужной персоне, информация считывается из файла и выводится на экран:

#include <fstream.h>

#include <iostream.h>

struct person

{char name[80];

int age;

};

int main()

{ person pers; 

 ifstream infile("d:/TEST.dat", ios::binary | ios::in );

 if(!infile) {cout<< "error1"<< endl;

                   return 1;

}

infile.seekg(0, ios::end);           //установить указатель файла в конец файла

int endpos = infile.tellg();         //получаем значение текущей позиции указателя файла

int n = endpos/sizeof(pers);       //вычисляем количество персон в файле

cout << “N person =” <<  n << endl;

cout << « input n : » << endl ;   //номер персоны, о которой нужна информация

cin >> n ;

int pos= (n-1) * sizeof(pers) ;  //вычисление первого байта с информацией о персоне

infile.seekg(pos);     //установить указатель файла на нужный байт

infile.read (reinterpret_cast<char *>(&pers), sizeof(pers));

cout << pers.name << “  “ <<pers.age << endl;   

return 0;  

}

Результаты работы программы:

N person = 5

input n :

5

sss  2

Строковые потоки

Строковые потоки позволяют для областей оперативной памяти (так же, как и для файлов) считывать информацию с клавиатуры и/или выводить на экран. Достаточно часто такие участки памяти определяются в программе как символьные массивы. Именно поэтому в обозначениях классов istrstream, ostrstream, strstream, определяемых в заголовочном файле strstream.h (или в некоторых компиляторах strstrea.h), используется приставка “str”, а объекты этих классов называют строковыми потоками.