Функція write класу ostream виводить фіксоване число байтів, починая з заданого місця в пам'яті, в заданий поток. Якщо потік зв’язаний з файлом, дані будуть записані починая з позиції в файлі, заданої вказівника позиції в файлі put. Функція read класу istream виводить фіксоване число байтів з заданого потоку в ділянку пам'яті, починая з вказаної адреси. Якщо потік пов’язаний з файлом, байти виводяться починая з позиції в файлі, заданої за допомогою вказівника позиції в файлі get.
Таким чином, для того, щоб записати в файл значення змінної цілого типу з іменем number замість використання оператору
outFile << number;
який може записати для чотирибайотовго цілого від одного до 11 символів (до 10 розрядів плюс знак, для кожного необхідний один байт пам'яті), можна використовувати оператор
outFile.write( ( char * ) &number, sizeof( number ) );
який завжди буде записувати в файл 4 байта для чотирибайтового цілого. Тип першого аргументу функції write це char * , тому необхідно використовувати перетворення типів. Другий аргумент визначає число байтів, які необхідно записати. Зазвичай функція write використовується для запису в файл значень структурних змінних.
Створемо програму для обробки інформації про 5 студентів вищого навчального закладу. Для кожного з студентів необхідно зберігати порядковий номер, прізвище, ім’я, по батькові, рейтинг (дійсне число від 0 до 5).
Спочатку створемо з незаповненими структурами для кожного студента – код дорівнює нулю, замість прізвища, ім’я, по батькові – порожній рядок, рейтинг 0.0.
#include <iostream>
#include <fstream>
using namespace std;
int main( ) {
struct student {
int id;
char pib[ 20 ];
double rating;
};
const int N = 5;
ofstream fout ( "test.txt", ios::out );
if ( !fout ) return 1;
student s = { 0, "", 0.0 };
for ( int i = 1; i <= N; i++ )
fout.write( ( char * ) &s, sizeof( student ) );
fout.close();
}
Для запису даних в файл будемо використовувати функцію seekp, яка встановлює вказівник файлу put в задану позицію в файлі. У функції один параметр – ціле число, номер байта, на який необхідно встановити вказівник put.
#include <iostream>
#include <fstream>
using namespace std;
int main( ) {
struct student {
int id;
char pib[ 20 ];
double rating;
};
const int N = 5;
student s[ N ] = {
{ 4, "Ddd A.A.", 4.4 },
{ 3, "Ccc A.A.", 3.3 },
{ 2, "Bbb A.A.", 2.2 },
{ 5, "Eee A.A.", 5.5 },
{ 1, "Aaa A.A.", 1.1 }
};
ofstream fout( "test.txt", ios::out );
if ( !fout ) return 1;
for ( int i = 0; i < N; i++ ) {
fout.seekp( ( s[ i ].id - 1 ) * sizeof( student ) );
fout.write( ( char * ) &s[ i ], sizeof( student ) );
}
fout.close();
}
Функція read класу istream читає в об’єкт задану кількість байтів з поточної позиції у потоці. Перший аргумент функцій – вказівник на char- адреса в пам'яті, в яку необхідно записати інформацію, другий вказівник – ціле число, кількість байтів, які необхідно прочитати.
#include <iostream>
#include <fstream>
using namespace std;
int main( ) {
struct student {
int id;
char pib[ 20 ];
double rating;
};
student s;
ifstream fin( "test.txt", ios::in );
if ( !fin ) return 1;
fin.read( ( char * ) &s, sizeof( student ) );
while ( ! fin.eof() ) {
cout << s.id << "\t" << s.pib << "\t" << s.rating
<<endl;
fin.read( ( char * ) &s, sizeof( student ) );
}
fin.close();}