Лабораторная работа №11 Работа с текстовыми файлами

Дисциплина «Основы алгоритмизации и программирования»

Цель работы – изучить функции для работы с двоичными файлами, освоить технику формирования двоичных файлов для переменных разной структуры, манипулировать информацией, записанной в двоичном файле.

Задания

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// Определяем новый тип данных, 
// который соответствует формату структуры. 
{    
charfam[50]; // Поле для фамилии. 
charpol; // Поле для пола. 
floatves; // Поле для веса. 
};    
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   
{   
charfam[50]; // Поле для фамилии.
charpol;// Поле для пола.
floatves;// Поле для веса.
};   
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 структуры spprintf(«%c\n»,sp.pol); // На экран монитора выводим поле pol структуры spprintf(«%f\n»,sp.ves); // На экран монитора выводим поле ves структуры spprintf(«\n»); // Пропускаем строку на экране монитора – граница

// между элементами списка структур

}

} fclose(f2); getch(); }

С двоичными файлами можно работать точно так же, как и с массивами. Разница между массивом и двоичным файлам состоит в следующем. Код a = x[i], справедливый для массива с именем для двоичного файла, соответствует двум кодам. Первый код устанавливает указатель файла на запись с индексом i. Второй код считывает запись с позиции i. Установка указателя на порядковый номер записи производится при помощи функции seek(), а считывание информации происходит при помощи функции fread(). Формат функций дан в лекциях. Аналогично происходит и при записи информации в двоичный файл, что для массива соответствует коду x[i]=a.

5. Ниже дан код программы для поставленной задачи.

struct sotr

{char fam[50]; char pol;

floatves;  
};   
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);

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

avatar
  Подписаться  
Уведомление о