Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ЯП - ПОИТ (Бахтизин) часть 1 редакт.doc
Скачиваний:
0
Добавлен:
01.04.2025
Размер:
1.76 Mб
Скачать

10.5. Функции ввода-вывода для работы с бинарными файлами

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

Для работы с бинарными файлами нужно использовать функции: fwrite() и fread().

unsigned fwrite(void *ptr,

unsigned size,

unsigned n,

FILE *stream);

Здесь ptr – адрес в памяти, начиная с которого будет прочитано size байт n раз и записано в файл stream. Возвращает количество записанных элементов.

unsigned fread(void *ptr,

unsigned size,

unsigned n,

FILE *stream);

Здесь ptr – адрес в памяти, начиная с которого будет записано size байт n раз из файла stream. Возвращает количество прочитанных элементов.

Эти функции без каких-либо изменений копируют блок данных из оперативной памяти в файл и из файла в память соответственно. По этой причине fread() и fwrite() работают быстрее, чем функции чтения и записи для текстовых файлов.

В нижеприведенной программе создается структура, состоящая из четырех полей, которые описывают имя, фамилию, отчество и возраст человека. Данные запрашиваются три раза, и каждый раз структура заносится в бинарный файл.

#include <stdio.h>

#include <conio.h>

void main(void)

{

struct man // Создаваемая стуктура

{

char im[10]; // Имя

char fam[10]; // Фамилия

char ot[10]; // Отчество

int vozr; // Возраст

};

FILE *out;

man m;

clrscr();

out = fopen("d:\\Ex2_bin.txt", "wb");

for (int i = 0; i < 3; i++)

{

puts("Enter Imia");

scanf("%s", m.im); //Считывается имя

puts("Enter Familiu");

scanf("%s", m.fam); //Считывается фамилия

puts("Enter Otchestvo");

scanf("%s", m.ot); //Считывается отчество

puts("Enter Vozrast");

scanf("%i", &m.vozr); //Считывается возраст

// Осуществляется запись в файл

fwrite(&m, sizeof(m), 1, out);

}

getch();

fclose(out);

clrscr();

puts("Reading from file");

// файл открывается для чтения

out = fopen("d:\\Ex2_bin.txt", "rb");

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

{

// считывается кол-во байт, занимаемых одной структурой

fread(&m, sizeof(m), 1, out);

//вывод на экран считанной структуры

printf("%s %s %s, vozrast (let) %i \n",

m.im, m.fam, m.ot, m.vozr);

}

fclose(out);

getch();

}

Все операции чтения/записи производятся через внутренний буфер в оперативной памяти (ОП).

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

Для принудительной записи содержимого буфера в файл используется функция fflush().

int fflush(FILE *file);

fflush() записывает содержимое буфера в файл file, файл при этом остается открытым. Возвращает ноль при успешном выполнении; ненулевое значение – при ошибке.

Если программа завершается нормально, то содержимое буфера дозаписывается автоматически.

Полезно знать, что текстовый файл, в принципе, не отличается от бинарного, поэтому любой бинарный файл может быть открыт для работы с ним, как с текстовым; а текстовый может быть открыт как бинарный. Но такой способ работы с файлом может приводить к ошибкам. Поэтому рекомендуется работать с конкретным файлом в том режиме, в котором он был создан.