Дисциплина «Основы алгоритмизации и программирования»
Цель работы – изучить функции для работы с двоичными файлами, освоить технику формирования двоичных файлов для переменных разной структуры, манипулировать информацией, записанной в двоичном файле.
Задания
1.Изучить:
а) способ формирования двоичного файла; б)основную терминологию, связанную с двоичными файлами; в) функции для работы с двоичным файлом;
г) возможности языка программирования по обработке файла с прямой организацией: запись данных в файл, чтение из файла, корректировка записей и т. п.
2.Разработать алгоритм решения в соответствии с заданием.
3.Составить программу решения задачи.
4.Подготовить тестовый вариант программы и исходных данных.
Контрольныевопросы
1.Объяснить, что означают следующие термины: «файл», «запись», «метод доступа», «структура записи»?
2.Каково назначение операторов открытия и закрытия файлов на языке программирования?
3.Указать, какие операторы выполняют запись данных в файл прямого доступа, читают данные из файла?
4.Привести пример использования файлов прямого доступа.
5.Какие позиции для указателя файла существуют в функции seek()?
6.Какие методы существуют для установки указателя в начало файла?
7.В чем заключается разница между режимами доступа «а», «r», «w».
Вариантызаданий
Перед началом работы программы создать текстовый файл с данными. Выполнить задание лабораторной работы № 9, используя двоичные
файлы.
| Языки программирования. Метод. указания по лаб. работам | -52- |

ЛАБОРАТОРНАЯ РАБОТА № 10 ДВОИЧНЫЕ ФАЙЛЫ
Примеррешениявариантазадания
Описать структуру из трех полей. Создать двоичный файл из множества структур. Данные для двоичного файла вводить из текстового файла. В двоичном файле переставить седьмой и третий элемент. Элементом структуры будем считать сотрудника со следующими данными: фамилия, пол, вес.
Анализ задачи.
1.Начальные данные:
а) новый тип данных формата структуры:
struct sotr {
char fam[30]; char pol; float ves;
}
б) текстовый файл spis.dat с информацией о сотрудниках; в) несколько переменных типа sort;
г) два указателя на файловую переменную (для текстового и двоичного).
2.Создаем текстовый файл со списком сотрудников. Для каждого поля сотрудника занимаем одну строку. Между информацией о сотрудниках формируем пустую строку.
3.Составляем программу ввода информации из текстового файла и вывода данных на экран монитора.
| struct sort | // Определяем новый тип данных, | |||
| // который соответствует формату структуры. | ||||
| { | ||||
| char | fam[50]; | // Поле для фамилии. | ||
| char | pol; | // Поле для пола. | ||
| float | ves; | // Поле для веса. | ||
| }; | ||||
| void main() | ||||
| { | ||||
| FILE *f1; | // Определяем указатель файла. | |||
| sotr sp; | // Определяем переменную типа sort. | |||
| clrscr(); | ||||
| f1 = fopen(«spis.dat»,»r»); | // Открываем текстовый файл с | |||
| // данными о сотрудниках. | ||||
| while ( !feof(f1)) | // | Цикл для ввода данных о сотрудниках из файла. | ||
| { | ||||
| fgets(sp.fam,50,f1); | // В поле fam структуры вводим фамилию. | |||
| fscanf(f1,»%c\n»,&sp.pol); | // | В поле pol структуры вводим пол. | ||
| fscanf(f1,»%f\n»,&sp.ves); | // | В поле ves структуры вводим вес. | ||
| fscanf(f1, «\n»); | // Пропускаем пустую строку в текстовом файле. | |||
| printf(«%s»,sp.fam); // На экран монитора выводим поле fam | ||||
| Языки программирования. Метод. указания по лаб. работам | -53- |

ЛАБОРАТОРНАЯ РАБОТА № 10 ДВОИЧНЫЕ ФАЙЛЫ
Пример решения варианта задания
// очередной структуры.
printf(«%c\n»,sp.pol); // На экран монитора выводим поле pol // очередной структуры.
printf(«%f\n»,sp.ves); // На экран монитора выводим поле ves
| // очередной структуры. | |||
| printf(«\n»); // | Пропускаем строку на экране | ||
| // монитора – граница между элементами списка структур. | |||
| fclose(f1); | |||
| getch(); } | |||
| 4. Составляем программу формирования двоичного файла. | |||
| struct sotr | |||
| { | |||
| char | fam[50]; | // Поле для фамилии. | |
| char | pol; | // Поле для пола. | |
| float | ves; | // Поле для веса. | |
| }; | |||
| void main() | |||
| { | |||
| FILE *f1, *f2; | |||
| sotr sp; | |||
| clrscr(); | |||
| f1 = fopen(«spis.dat»,»r»); | |||
| f2 = fopen(«dv_fl.dat»,»wb»); | // | Открываем файл для записи | |
| // информации в двоичном виде. | |||
| while ( !feof(f1)) | |||
| { | |||
| fgets(sp.fam,50,f1); | |||
| fscanf(f1,»%c\n»,&sp.pol); | |||
| fscanf(f1,»%f\n»,&sp.ves); | |||
| fscanf(f1, «\n»); | |||
| fwrite( &sp , sizeof(sotr), 1, f2); | // Производим запись о сотруднике |
// в двоичном виде в файл.
}
fclose(f1);
fclose(f2);
f2 = fopen(«dv_fl.dat»,»rb»); // Открываем файл для ввода информации
//из двоичного файла в память компьютера.
//Вывод данных из двоичного файла.
while ( !feof(f2))
{
fread( &sp , sizeof(sotr), 1, f2); // Из двоичного файла
//в переменную sp читаем всю информацию
//(не по полям!!!) о сотруднике.
| Языки программирования. Метод. указания по лаб. работам | -54- |

ЛАБОРАТОРНАЯ РАБОТА № 10 ДВОИЧНЫЕ ФАЙЛЫ
Пример решения варианта задания
if ( !feof(f2))
{
printf(«%s»,sp.fam); // На экран монитора выводим поле fam структуры sp. printf(«%c\n»,sp.pol); // На экран монитора выводим поле pol структуры sp. printf(«%f\n»,sp.ves); // На экран монитора выводим поле ves структуры sp. printf(«\n»); // Пропускаем строку на экране монитора – граница
// между элементами списка структур
}
} fclose(f2); getch(); }
С двоичными файлами можно работать точно так же, как и с массивами. Разница между массивом и двоичным файлам состоит в следующем. Код a = x[i], справедливый для массива с именем x для двоичного файла, соответствует двум кодам. Первый код устанавливает указатель файла на запись с индексом i. Второй код считывает запись с позиции i. Установка указателя на порядковый номер записи производится при помощи функции seek(), а считывание информации происходит при помощи функции fread(). Формат функций дан в лекциях. Аналогично происходит и при записи информации в двоичный файл, что для массива соответствует коду x[i]=a.
5. Ниже дан код программы для поставленной задачи.
struct sotr
{char fam[50]; char pol;
| float | ves; | ||
| }; | |||
| void main() | |||
| {FILE *f1, *f2; | |||
| sotr sp, sp1; | |||
| int i, k = 0; | |||
| clrscr(); | |||
| f1 = fopen(«spis.dat»,»r»); | |||
| f2 = fopen(«dv_fl.dat»,»wb»); | |||
| while ( !feof(f1)) | |||
| { fgets(sp.fam,50,f1); | |||
| fscanf(f1,»%c\n»,&sp.pol); // Обратить внимание на \n | |||
| fscanf(f1,»%f\n»,&sp.ves); | |||
| fscanf(f1, «\n»); | |||
| fwrite( &sp , sizeof(sotr), 1, f2); | } | ||
| fclose(f1); | |||
| fclose(f2); | |||
| f2 = fopen(«dv_fl.dat»,»r+b»); | |||
| cout << «\t\tДо перестановки: | \n»; | ||
| Языки программирования. Метод. указания по лаб. работам | -55- |

ЛАБОРАТОРНАЯ РАБОТА № 10 ДВОИЧНЫЕ ФАЙЛЫ
Пример решения варианта задания
while ( !feof(f2))
{ fread( &sp , sizeof(sotr), 1, f2); k++;
if ( !feof(f2))
{ printf(«Фамилие\t%s»,sp.fam); printf(» пол\t%c\n»,sp.pol); printf(» вес\t%f\n»,sp.ves); printf(«\n»); }
if (k == 5) { getch(); clrscr(); k = 0;} } getch();
clrscr();
i = 2; // Определяем номер сотрудника.
fseek( f2, (long)i * sizeof(sotr), SEEK_SET); // Устанавливаем курсор
| // | на 2-ю запись в двоичном файле. |
| fread( &sp, sizeof(sotr), 1, f2); | // В переменной sp из файла |
//читаем информацию о сотруднике, позиция
//которого определена кодом fseek().
i= 7; // Определяем номер сотрудника.
fseek( f2, (long)i * sizeof(sotr), SEEK_SET); // Устанавливаем курсор
// на 7-ю запись в двоичном файле. fread( &sp1, sizeof(sotr), 1, f2); // В переменной sp1 из файла читаем
//информацию о сотруднике, позиция
//которого определена кодом fseek().
i = 2;
fseek( f2, (long)i * sizeof(sotr), SEEK_SET); // Устанавливаем курсор
// на 2-ю запись.
fwrite( &sp1, sizeof(sotr), 1, f2); // Во 2-ю позицию файла переписываем
// информацию из седьмой.
i = 7;
fseek( f2, (long)i * sizeof(sotr), SEEK_SET); // Устанавливаем курсор
// на 7-ю запись.
fwrite( &sp, sizeof(sotr), 1, f2); // В 7-ю позицию файла переписываем
// информацию из второй.
rewind(f2);
cout << «\t\tПосле перестановки в файле: \n»; k = 0;
while ( !feof(f2))
{ fread( &sp , sizeof(sotr), 1, f2); k++;
if ( !feof(f2))
{ printf(«Фамилие\t%s»,sp.fam); printf(» пол\t%c\n»,sp.pol); printf(» вес\t%f\n»,sp.ves); printf(«\n»); }
| Языки программирования. Метод. указания по лаб. работам | -56- |

ЛАБОРАТОРНАЯ РАБОТА № 10 ДВОИЧНЫЕ ФАЙЛЫ
Пример решения варианта задания
if (k == 5) { getch(); clrscr(); k = 0; }
}
fclose(f2); getch(); }
Комментарий. Если проводить аналогию между двоичным файлом и массивом, то практически в программе для двоичного файла реализована перестановка двух элементов массива с индексами 2 и 7. Для массива данная перестановка решается так:
a = x[2]; x[2] = x[7]; x[7] = a;
А для двоичного файла та же самая операция выполняется следующим набором кодов:
i = 2;
fseek( f2, (long)i * sizeof(sotr), SEEK_SET); fread( &sp, sizeof(sotr), 1, f2);
i = 7;
fseek( f2, (long)i * sizeof(sotr), SEEK_SET); fread( &sp1, sizeof(sotr), 1, f2);
i = 2;
fseek( f2, (long)i * sizeof(sotr), SEEK_SET); fwrite( &sp1, sizeof(sotr), 1, f2);
i = 7;
fseek( f2, (long)i * sizeof(sotr), SEEK_SET); fwrite( &sp, sizeof(sotr), 1, f2);

Оставить комментарий