- •Оглавление
- •ВВЕДЕНИЕ
- •Задания
- •ЛАБОРАТОРНАЯ РАБОТА № 2 ВЫЧИСЛЕНИЕ ВЫРАЖЕНИЙ
- •Задания
- •ЛАБОРАТОРНАЯ РАБОТА № 3 ПРОГРАММИРОВАНИЕ АЛГОРИТМОВ РАЗВЕТВЛЯЮЩЕЙСЯ СТРУКТУРЫ
- •Задания
- •ЛАБОРАТОРНАЯ РАБОТА № 4 ЦИКЛЫ
- •Задания
- •ЛАБОРАТОРНАЯ РАБОТА № 5 ОДНОМЕРНЫЕ МАССИВЫ
- •Задания
- •ЛАБОРАТОРНАЯ РАБОТА № 6 ОБРАБОТКА МАТРИЦ
- •Задания
- •ЛАБОРАТОРНАЯ РАБОТА № 7 ДИНАМИЧЕСКИЕ МАССИВЫ
- •ЛАБОРАТОРНАЯ РАБОТА № 8 ТЕКСТОВЫЕ ФАЙЛЫ
- •Задания
- •ЛАБОРАТОРНАЯ РАБОТА № 9 СТРУКТУРЫ
- •Задания
- •ЛАБОРАТОРНАЯ РАБОТА № 10 ДВОИЧНЫЕ ФАЙЛЫ
- •Задания
- •ЛАБОРАТОРНАЯ РАБОТА № 11 ФУНКЦИИ
- •Задания
- •ЛАБОРАТОРНАЯ РАБОТА № 12 РЕКУРСИВНЫЕ ФУНКЦИИ
- •Задания
- •ЛАБОРАТОРНАЯ РАБОТА № 13 ОДНОСВЯЗНЫЕ СПИСКИ
- •Задания
- •ЛАБОРАТОРНАЯ РАБОТА № 14 ДВУСВЯЗНЫЕ ЛИНЕЙНЫЕ СПИСКИ
- •Задания
- •ЛАБОРАТОРНАЯ РАБОТА № 15 АЛГОРИТМЫ НА ГРАФАХ
- •Задания
- •ЛАБОРАТОРНАЯ РАБОТА № 16 БИНАРНЫЕ ДЕРЕВЬЯ
- •Задания
- •Задание
- •ЛАБОРАТОРНАЯ РАБОТА № 18 РЕШЕНИЕ ВЫЧИСЛИТЕЛЬНЫХ ЗАДАЧ НА АССЕМБЛЕРЕ
- •ЛАБОРАТОРНАЯ РАБОТА № 19 ОБРАБОТКА ФАЙЛОВ
- •ЛАБОРАТОРНАЯ РАБОТА № 20 РАБОТА С ДИНАМИЧЕСКОЙ ПАМЯТЬЮ
- •ЛАБОРАТОРНАЯ РАБОТА № 21 РАБОТА С ПРЕРЫВАНИЯМИ
- •ЛАБОРАТОРНАЯ РАБОТА № 22 ПЕРЕМЕЩЕНИЕ ПРОГРАММ ПО ПАМЯТИ
- •ЛАБОРАТОРНАЯ РАБОТА № 23 МОДУЛЬНОЕ ПРОГРАММИРОВАНИЕ
- •ЛАБОРАТОРНАЯ РАБОТА № 24 КОНСОЛЬНОЕ WINDOWS-ПРИЛОЖЕНИЕ
- •ЛАБОРАТОРНАЯ РАБОТА № 25 ОКОННЫЕ WINDOWS-ПРИЛОЖЕНИЯ
- •ЛАБОРАТОРНАЯ РАБОТА № 26 ПРОГРАММИРОВАНИЕ СОПРОЦЕССОРА
- •Задания
- •БИБЛИОГРАФИЧЕСКИЙ СПИСОК
- •Основной
- •Дополнительный
ЛАБОРАТОРНАЯ РАБОТА № 10 ДВОИЧНЫЕ ФАЙЛЫ
Цель работы – изучить функции для работы с двоичными файлами, освоить технику формирования двоичных файлов для переменных разной структуры, манипулировать информацией, записанной в двоичном файле.
Задания
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);
Студенту рекомендуется тщательно проанализировать предложенные коды для того, чтобы лучше понять технику работы с двоичными файлами.
Языки программирования. Метод. указания по лаб. работам |
-57- |