Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
YaP_laby.pdf
Скачиваний:
159
Добавлен:
31.05.2015
Размер:
915.49 Кб
Скачать

ЛАБОРАТОРНАЯ РАБОТА № 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-

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]