Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Информатика_и_Пр_Бизнес_лекции.doc
Скачиваний:
84
Добавлен:
10.05.2015
Размер:
1.21 Mб
Скачать

9.7. Чтение данных из двоичного файла

Функция read классов ifstream и fstream читает из файла заданное в функции количество байтов и записывает их по заданному в функции адресу оперативной памяти.

Синтаксис вызова функции read:

f.read (адрес, количество байтов)

где f – файловая переменная. Первый аргумент функции – указатель на символ. Например, оператор:

f.read((char*)&r,sizeof r);

считывает из файла sizeof r байтов и записывает их по адресу переменной r. Поток байтов считывается из текущего положения указателя файла. При открытии файла в режиме чтения первая порция данных считывается из начала файла. При считывании указатель файла перемещается в позицию, следующую после последнего считанного байта.

Пример программы, которая выводит на экран информацию о всех муниципальных округах заданного административного округа, записанных в двоичном файле:

#include <fstream.h>

#include <iostream.h>

#include <conio.h>

#include <string.h>

struct mo //модель муниципального округа

{

int number;

char name[20];

char ao[12];

char tel[12];

};

void read_file(char file_name[ ], char ao[ ]);

void main( )

{

char ao[12]; //административный округ

cout<<”ao? “;

cin>>ao;

read_file (“mo.mos”, ao);

getch();

}

void read_file(char file_name[ ],char ao[ ])

{

mo m; //муниципальный округ

ifstream f; //входной файловый поток

f.open(file_name, ios::in|ios::binary); //открытие файла для чтения

while(!f.eof())

{

f.read((char*)&m,sizeof m);

if(!f.eof()) //контроль конца файла

if(strcmp(m.ao,ao)==0)

cout<<m.number<<’ ‘<<m.name<<’ ‘<<m.ao<<’ ‘<<m.tel<<endl;

}

f.close();

}

9.8. Изменение данных двоичного файла

Данные одного типа в двоичном файле имеют одинаковую длину, поэтому их можно изменять «по месту» без использования вспомогательного файла. Для установки указателя файла в позицию, с которой надо изменять данные, используется функция классов ofstream и fstream seekp.

Синтаксис вызова функции seekp:

f.seekp (смещение в байтах, заданная позиция в файле)

где f – файловая переменная. Функция seekp перемещает указатель записи файла относительно позиции, заданной вторым параметром функции, на определенное первым параметром функции количество байтов.

Позиция указателя в файле задается символическими константами:

  • ios::beg - начало файла, задается по умолчанию;

  • ios::end - конец файла;

  • ios::cur - текущая позиция.

Пример программы, которая изменяет контактный телефон муниципального округа с заданным номером:

#include <fstream.h>

#include <iostream.h>

#include <conio.h>

struct mo //модель муниципального округа

{

int number;

char name[20];

char ao[12];

char tel[12];

};

/*Функция изменения контактного телефона муниципального округа с номером n на значение new_tel в двоичном файле*/

void edit (char file_name[], int n, char new_tel[]);

void main()

{

int n; //номер муниципального округа

char new_tel[12]; //новый телефон

cout<<” n? ”;

cin>>n;

cout<<”tel? ”;

cin>>new_tel;

edit (“mo.mos”,n, new_tel);

}

void edit (char file_name[],int n, char new_tel[])

{

fstream f; //изменяемый файл

mo m; //муниципальный округ

f.open(file_name, ios::in|ios::out|ios::binary); //открытие файла для //чтения и записи

while (!f.eof() ) //поиск изменяемой записи в файле

f.read((char*)&m,sizeof m);

if (!f.eof())

{

if(m. number ==n) //округ найден

break;

}

if (!f.eof()) //контроль конца файла

{

strcpy(m.tel,new_tel); //изменение записи в оперативной памяти

//Сдвиг указателя файла в начало изменяемой записи файла

f.seekp(-sizeof(f),ios::cur);

f.write((char*)&m,sizeof m); //изменение записи в файле

}

f.close();

}