Если файл открыт в бинарном режиме, его можно записывать или считывать побайтно. Функция fseek() позволяет обращаться с файлом как с массивом и переходить к любой позиции в файле, обеспечивая возможность произвольного доступа. Если текстовые файлы являются файлами с последовательным доступом, то произвольный доступ чаще всего применяется к бинарным файлам.
Бинарные файлы могут содержать любую информацию. Чаще всего используются файлы, содержащие структуры. Для чтения и записи в бинарные файлы можно использовать функции fread(), fwrite() или fscanf(),fprintf().
fread –функция для чтения из файла:
int fread(void *ptr, unsigned size, unsigned count, FILE *f);
Из файла f считываются и по адресу ptr записываются count элементов размером size каждый. Функция возвращает число фактически считанных элементов.
fwrite – функция для записи в файл:
int fwrite(void *ptr, unsigned size, unsigned count, FILE *f);
В файл записываются, начиная с адреса ptr, count элементов размером size каждый. Функция возвращает число фактически записанных элементов.
fseek – функция для произвольного доступа к байтам бинарных файлов:
int fseek(FILE *f, long offset, int w);
offset показывает, на сколько байт нужно сместиться относительно точки отсчёта – w.
w должно быть равно одной из трех констант:
SEEK_SET или 0 - начало файла;
SEEK_CUR или 1 – текущая позиция в файле;
SEEK_END или 2 – конец файла.
ftell - возвращает текущую позицию в файле как длинное целое:
long int ftell (FILE *f);
Пример обработки бинарного файла
Составить программу, выполняющую следующие функции:
1. Создание нового файла;
2. Просмотр файла;
3. Добавление информации в конец файла;
4. Поиск по названию товара;
Файл создать из структур вида: название товара, его цена и количество.
Задание выполнить в отдельных функциях. Использовать меню для выбора функций.
#include <stdio.h>
#include <conio.h>
#include <string.h>
#include <stdlib.h>
struct tov {char name[10]; float c; int kol;} t1;
void input(FILE *); // создание нового файла
void print(FILE *); // просмотр файла
void app(FILE *); // добавление в файл
void find(FILE *); // поиск и изменение
main()
{ char c;
FILE *tf;
while (1)
{ system(“CLS”);
puts(" 1 – новый файл");
puts(" 2 – просмотр файла");
puts(" 3 – добавление в файл");
puts(" 4 – поиск ");
puts(" 0 - выход");
c=getch();
switch(c)
{ case '1':input(tf);break;
case '2':print(tf);break;
case '3':app(tf);break;
case '4':find(tf);break;
case '0':return 0;
default : puts(" неверный режим");
}
}
}
void input(FILE *tf)
{ char ch;
tf=fopen("file1.dat","wb"); // открытие бинарного файла для записи
system(“CLS”);
printf("\n Ввод товаров\n");
do
{ printf("\n название: "); scanf("%s",&t1.name);
printf(" цена: "); scanf("%f",&t1.c);
printf(" количество: "); scanf("%d",&t1.kol);
fwrite(&t1,sizeof(t1),1,tf); // запись в файл одной структуры t1
printf("\n Закончить? y/n ");
ch=getch();
}
while (ch != 'y');
fclose(tf);
}
void print(FILE *tf)
{ int i;
system(“CLS”);
tf=fopen("file1.dat","rb"); // открытие бинарного файла для чтения
i=1;
fread(&t1,sizeof(t1),1,tf); // чтение из файла одной структуры t1
while (!feof(tf))
{ printf("\n %3d tovar %10s cena %6.2f kolic %4d",i,t1.name,t1.c,t1.kol);
fread(&t1,sizeof(t1),1,tf);
i++;
}
getch();
}
void app(FILE *tf)
{ char ch;
tf=fopen("file1.dat","ab"); // открытие бинарного файла для добавления
system(“CLS”);
printf("\n Ввод товаров \n");
do
{ printf("\n название: "); scanf("%s",&t1.name);
printf(" цена: "); scanf("%f",&t1.c);
printf(" количество: "); scanf("%d",&t1.kol);
fwrite(&t1,sizeof(t1),1,tf);
printf(" Закончить? y/n ");
ch=getch();
}
while (ch != 'y');
fclose(tf);
}
void find(FILE *tf)
{ char c,tov[10];
tf=fopen("file1.dat","rb+"); // открытие бинарного файла для чтения и записи
system(“CLS”);
puts(" Название искомого товара: ");
gets(tov);
fread(&t1,sizeof(t1),1,tf);
while (!feof(tf))
{ if (strcmp(t1.name,tov)==0)
{
printf(" tovar %10s cena %6.2f kolic %d",t1.name,t1.c,t1.kol);
getch();
}
fread(&t1,sizeof(t1),1,tf);
}
fclose(tf);
}
Варианты заданий:
На 4-5:
1. Создать бинарный файл. Записать в него числа.
2. Вычислить среднее арифметическое цифр в бинарном файле.
3. Вычислить среднее арифметическое чисел в файле.
4. Выполнить сортировку методом вставок в файле.
На 6-7:
1. В двоичном файле указан размер квадратной матрицы, а затем построчно записаны элементы матрицы целых чисел. Таких групп данных в файле несколько. Вычислить сумму элементов, расположенных ниже главной диагонали. Результат записать в коней файла. Имя файла задается в командной строке.
2. Удалить из бинарного файла чисел, содержащиеся в текстовом файле. Имена файлов получить из командной строки. В файлах содержится числовая информация.
3. Имеются два бинарных файла, упорядоченных по возрастанию. Переписать информацию в третий файл, упорядочивая ее по убыванию. Дополнительных массивов и файлов не использовать, сортировку не выполнять.
4. Из текстового файла удалить числа, содержащиеся в бинарном файле.
5.Выполнить сортировку бинарного файла методом вставок. Дополнительных массивов и файлов не использовать.
6. Для бинарного файла выполнить сортировку длинных целых чисел методом «через отбор». Дополнительных массивов и файлов не использовать.
7. В бинарном файле выполнить реверсивный переворот содержащихся в нем целых чисел. Дополнительных массивов и файлов не использовать.
8. Вбинарномчисловомфайлевыполнитьперестановкуместами 1 и 2, 3 и 4 ит.д. элементов. Дополнительных массивов и файлов не использовать.
10. Для существующего упорядоченного бинарного файла ввести с клавиатуры несколько чисел, размещая их в файле без нарушения его упорядоченности по возрастанию. Дополнительных массивов и файлов не использовать.
На 8-9:
1.Используя функции и режим меню, создать бинарный файл из 10 записей, просмотреть файл, добавить в файл новую информацию и, применяя режим прямого доступа, выполнить задание по своему варианту.
2. Запись имеет вид: фамилия, пол, год рождения и рост. Вывести данные о самом высоком спортсмене.
3. Запись имеет вид: название вуза, число студентов, количество факультетов. Добавить в конец файла информацию о трех новых вузах и посчитать общее число студентов.
4. Запись имеет вид: название издания, газеты или журнала, стоимость одного экземпляра, количество экземпляров в год. Вывести на печать информацию о самом дешевом издании.
5. Запись имеет вид: фамилия студента, номер зачетной книжки, 4 оценки за экзамен. Выводить информацию о всех двоечниках и корректировать ее.
6. Запись имеет вид: фамилия спортсмена, его номер, количество набранных очков. Поменять местами в файле записи о первых двух спортсменах. *
7. Запись имеет вид: фамилия, номер телефона, дата рождения. Внести в начало списка информацию о четырех новых знакомых.
8. Запись имеет вид: название инструмента, число, месяц и год изготовления. Вывести на печать информацию об инструменте с самым большим сроком использования и выполнить корректировку этой записи.
9. Запись имеет вид: номер читательского билета, автор книги, название, дата заказа. Вывести на экран содержимое файла. Поменять местами первую и последнюю записи в файле.*
10. Запись имеет вид: фамилия спортсмена, его номер, количество набранных очков. Удалить из списка информацию о спортсмене с наименьшим количеством очков.
11. Запись имеет вид: фамилия, количество вещей, общий вес. Удалите из файла сведения о багаже, общий вес вещей в котором меньше, чем 10 кг.
12. Запись имеет вид: название команды, количество набранных очков, фамилии капитанов. Вывести на печать список в порядке набранных мест.
13. Запись имеет вид: марка видеомагнитофона, стоимость, количество. Напечатать информацию об имеющихся в продаже магнитофонах. При покупке их количество соответственно уменьшается. Предусмотреть удаление информации о видеомагнитофонах, количество которых равно нулю.