Объясните почему.
В программе открывается для записи бинарный выходной файл, в который записываются 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
В программе открывается для чтения бинарный файл (созданный в предыдущей программе), в котором записана информация о нескольких персонах, затем указатель файла устанавливается на начало информации о нужной персоне, информация считывается из файла и выводится на экран:
#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”, а объекты этих классов называют строковыми потоками.
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.