ИССЛЕДОВАНИЕ ОСОБЕННОСТЕЙ ПРИМЕНЕНИЯ ФАЙЛОВЫХ ОПЕРАЦИЙ В Си.




Лабораторная работа N 7.

 

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

 

Краткие теоретические сведения Файл – это поименованная область памяти на внешнем носителе, предназначенная для хранения информации. Файл может быть связан с любым источником или потребителем информации. Файл может быть входным или выходным. Из входного файла программа получает данные, в выходной выводит их. Каждый файл имеет имя, которое зарегистрировано в заглавии носителя информации. С помощью команд операционной системы можно осуществлять те или иные действия над файлами.

Существует два способа доступа к компонентам файла: последовательный и произвольный (параллельный). При последовательном способе доступа поиск начинается с начала файла и проверяется по очереди каждый компонент, пока не будет найден нужный. Произвольный способ доступа позволяет обращаться к компоненту по его порядковому номеру в файле. Допускается большая гибкость при работе с файлами. В частности, компоненты последовательного организованного файла могут обрабатываться произвольно, а компоненты произвольного файла – последовательно. Однако с самого начала на основе анализа структуры данных следует выбрать, какой способ доступа к компонентам необходим, что в конечном итоге и определит эффективность программы.

Файлы последовательного доступа используются для решения задач, требующих поочередной обработки компонент файла при отсутствии жестких ограничений на время решения. Работа с последовательными файлами предполагает создание файла, его обработку и корректировку.

Для создания последовательного файла необходимо выполнить следующие шаги:

  • Создать указатель на файл (FILE *file_pointer;)
  • Открыть файл (pointer = fopen(“FILE_NAME”,”mode”))
  • Подготовить информацию для ввода;
  • Записать в файл компоненты (fputs(var, file_pointer))
  • Закрыть созданный файл (fclose())

Пример. Создать файл с посимвольным вводом данных, который продолжается до тех пор, пока не нажата клавиша Enter

 

#include <stdio.h>

main()

{

FILE *fp;

Char letter;

If ((fp = fopen(“MYFILE.TXT”, “w”)) = = NULL)

{

puts(“Невозможно открыть файл”);

exit();

}

do

{letter = getc();

fputc(letter, fp);

}

while(letter!= ‘\r’);

fclose(fp);

}

Чтобы обработать хранящиеся в файле данные, необходимо получить доступ к компонентам файла. Для этого надо:

  • Создать указатель на файл;
  • Открыть уже существующий на диске файл
  • Последовательно считать компоненты до нужного
  • Выполнить обработку
  • Закрыть файл

Пример. Программа читает файл созданный в предыдущем примере:

#include <stdio.h>

main()

{ FILE *fp;

Char letter;

If ((fp = fopen(“MYFILE.TXT”, “w”)) = = NULL)

{

puts(“Невозможно открыть файл”);

exit();

}

while ((letter = fgetc(fp))!= EOF)

//операторы выполняющие обработку

printf(“%c”, letter);

 

fclose(fp);

}

 

Функции, работающие с символами, предназначены только для чтения и записи текста. Если требуется записать или прочитать из файла, либо отпечатать на принтере данные, содержащие числовые значения, то необходимо использовать функции fprintf() и fscanf(). Для записи инструкций с этими функциями используется тот же синтаксис, что и для функций printf() и scanf(), но в этом случае требуется еще включить указатель на файл, чтобы определить, куда следует записать или откуда читать данные:

fprintf(FILE *Stream, control_string, data_list);

fscanf(FILE *Stream, control_string, data_list);

Для чтения структурированной информации из файла используется функция fread(). Синтаксис данной функции следующий:

unsigned fread(void Buf, int Size int Count FILE *Stream)

Выполнение функции fread() приводит к вводу из файла, идентифицируемого аргументом Stream, порции информации, местоположение Buf и размер Count которой в оперативной памяти указан посредством Size. Результатом работы функции является величина со значениями, равным количеству вводимых объектов информации. Если данное количество меньше чем Count, то это означает наличие ошибки выполнения функции или ввод данных из файла, находящегося в конечной позиции.

Пример. Ниже приведены две программы, причем первая из них осуществляет ввод и запись в файл данных инвентарной описи, а вторая – считывает их.

 

Пример 1

 

 

#include <stdio.h>

main()

{

FILE *fp;

Char name[20];

Int quantity;

Float cost;

 

If ((fp = fopen(“MYFILE.TXT”, “w”)) = = NULL)

{

puts(“Невозможно открыть файл”);

exit();

}

printf(“Введите наименование товара: ”);

gets(name);

fputc(letter, fp);

while (strlen(name) > 0)

{

printf(“Введите цену товара: ”);

scanf(“%f, &cost”);

printf(“Введите количество единиц товара: ”);

scanf(“%d, &quantity”);

fprintf(fp, “%s %f %d \n”, name, cost, quantity);

printf(“Введите наименование товара: ”);

gets(name);

}

 

fclose(fp);

}

 

Пример 2

 

#include <stdio.h>

main()

{

FILE *fp;

Char name[20];

Int quantity;

Float cost;

 

If ((fp = fopen(“MYFILE.TXT”, “w”)) = = NULL)

{

puts(“Невозможно открыть файл”);

exit();

}

while (fscanf(fp, “%s %f %d”, name, &cost, &quantity)!= EOF)

{

printf(“Наименование товара: %s \n”, name);

printf(“Цена товара: %2f \n”, cost);

printf(“Количество единиц товара: %d \n”, quantity);

}

 

fclose(fp);

}

Возможны три вида корректировки последовательного файла: расширение файла за счет внесения новых компонентов, полная замена содержимого записи и корректировка значений полей отдельных записей. Все три вида одинаково применимы и к последовательным, и к произвольным файлам.

Если файл, который уже существует на диске, открыть с режимом доступа “w”, вся информация, имевшаяся на нем в настоящий момент, будет уничтожена. Для того чтобы добавить данные в уже существующий на диске файл, следует открывать его с режимом доступа “a”. Если режим ”a” используется для файла, которого нет на диске, он будет создан, а если файл существует, в него будет добавлена новая информация.

При расширении файла новые компоненты записываются сразу за его последним компонентом. Расширение файла предполагает выполнения следующих шагов:

  • Создать указатель на файл (FILE *file_pointer;)
  • Открыть файл (pointer = fopen(“FILE_NAME”,”mode”))
  • Установить указатель файла за последним компонентом
  • Подготовить информацию для ввода;
  • Записать в файл компоненты (fputs(var, file_pointer))
  • Закрыть созданный файл (fclose())

 

Файлы произвольного доступа создаются для решения задач, требующих оперативного доступа к хранимой информации или при наличии зависимости значений поля компонента от порядкового номера компонента в файле.

Работа с файлом произвольного доступа предполагает его организацию, обработку и корректировку.

Организовать файл произвольного доступа можно двумя способами: 1) создать последовательный файл и обращаться к его компонентам по их порядковому номеру, трактуя последовательный файл как произвольный; 2) создать файл фиктивных записей, затем загрузить его по ключу фактическими данными.

Певый способ аналогичен созданию последовательного файла, а форматизация заключается во внесении в файл компонентов, значение полей которых носит фиктивный характер (например, нули или пробелы)

 

Задание на работу Выполнить демонстрационные программы и сделать выводы письменно.

  • Организовать последовательный файл с именем BIBL.MY на дисководе. Структура записи следующая: порядковый номер книги; название книги; индекс книги. Блок организации оформить функцией с именем Org. Значение полей ввести с экрана. Признак окончания ввода – 9999 в области номера. Сохранить текст программы на диске с именем PSozd.
  • Расширить файл BIBL.MY двумя новыми компонентами, для чего написать фунцию с именем Korr. Сохранить текст на диске под именем PKorr.
  • Форматизовать файл произвольного доступа из 20 записей на дисководе. Формат компонентов такой же как и предыдущих заданиях. Оформить блок как фунцию с именем Form и сохранить программу под именем NForm.
  • Внести в файл BIBL.MY фактические записи с номерами 3, 5, 7. Оформить блок загрузки функцией с именем Zagrk1, а текст программы сохранить на диске под именем NZagrk1.
  • Вывести на экран 6 и 7 компоненты файла BIBL.MY. Блок вывода оформить в виде функции с именем Obrk1, а сохранить на диске под именем NObrk1
  • Все функции работы с файлами объединить в одной программе. Причем создать простейшее меню, которое будет вызывать функции путем указания номера нужного режима в меню. После выполнения функции осуществляется возврат в основную программу. Выход из программы осуществляется отдельным режимом заданным пунктом меню.


Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2016-04-27 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: