Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ЛР_2_6_Работа_с_файлами.doc
Скачиваний:
0
Добавлен:
15.11.2018
Размер:
237.06 Кб
Скачать

3. Работа с файлами с произвольным доступом

Задание

Текст программы

Результат выполнения

Выводы

  1. Составить на языке Си программу открытия и записи в текстовый файл

« NAME.BIN» с произвольным доступом текста в виде списка из пяти русских имен.

Ввести и отладить данную программу.

7.Доработать программу предыдущего задания так, чтобы был обеспечен вывод на экран файла «NAME.BIN», записанного ранее.

/* Программа 7*/

/* Программа 8 */

Как и при работе с файлами с последовательным доступом результат выполнения программы может быть обнаружен косвенно, путем просмотра записанного файла в MS DOS.

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

Надо поискать файл.

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

Выводы по пункту 3:

1.

2.

Выводы по всей работе:

1.

2.

3.

Методические рекомендации при подготовке к лабораторному занятию.

(Основа – материалы книг: 1.Березин Б.И., Березин С.Б. Начальный курс С и С++.-М.: ДИАЛОГ-МИФИ,1998.-288с.

2. А.И. Гусева. Учимся программировать: Pascal 7.0. Учебное пособие. – М.: Диалог- МИФИ, 2001г)

1. Краткие теоретические сведения по работе с файлами в языке си при вводе/выводе.

Понятие файл в языке СИ тесно связано с понятием поток. Поток – некоторое логическое устройство ввода/вывода не зависящее от того, как оно реализовано физически. В СИ существует два типа потоков – текстовый ( TEXT) и двоичный (BINARY). Файл – это способ хранения информации на физическом устройстве. Таким образом, под файлом в СИ можно понимать как информацию на диске, так и физическое устройство. Поскольку поток является логическим уровнем работы с данными, а файл – физическим, то должна существовать некоторая управляющая структура, обеспечивающая взаимодействие между ними. Эта структура называется FILE. Она описана в заголовочном файле STDIO.H. Связь между файлом и потоком устанавливается при открытии файла и разрывается при его закрытии. Работа с файлами в основном осуществляется при вводе/выводе информации. В системе ввода/вывода стандарта ANSI роль связующего звена между файлом и потоком выполняет указатель на файл (FILE POINTER). С его помощью задается имя файла на диске, статус, использование файла в потоке, ассоциированном с файлом и некоторые другие характеристики файла. Указатель файла – это указатель на структуру FILE, определенную в заголовочном файле STDIO.H. Кроме того, в STDIO.H определены функции:

Функция

Содержание функции

fopen()_

Открыть файл

fclose()

Закрыть файл

fputs()

Записать строку символов в поток

fgets()

Прочитать строку символов из потока

fseek()

Изменить указатель позиции файла на указанное место

fprintf()

Форматная запись в файл

fscanf()

Форматное чтение из файла

feof()

Вернуть значение «истинно» при достижении конца файла

ferror()

Вернуть значение «ложно» при обнаружении ошибки

fread()

Прочитать блок данных из потока

fwrite()

Записать блок данных в поток

rewind()

Установить указатель позиции файла на начало

remove()

Удалить файл

Для объявления указателя на файл используется оператор вида

FILE *fp;

Например, для открытия файла с именем «dat» для записи достаточно записать операторы

FILE*fp;

fp=fopen(“dat”,”w”);

Здесь функция открытия файла fopen() имеет прототип вида

FILE*fopen(char*filename,char*mode);

Где mode–это строка, содержащая режим открытия файла.

Функция fopen() выполняет следующие действия:

-открывает поток и связывает файл на диске с этим потоком;

-возвращает указатель ассоциированный с этим потоком.

Режимы открытия файла приведены в таблице

Режим

Действия

“r”

Открыть для чтения

“w”

Создать для записи

“a”

Открыть для добавления в существующий файл

“rb”

Открыть двоичный файл для чтения

“wb”

Открыть двоичный файл для записи

“ab”

Открыть двоичный файл для добавления

“r+”

Открыть файл для чтения и записи

“w+”

Создать файл для чтения и записи

“a+”

Открыть для добавления или создать для чтения и записи

“r+b”

Открыть двоичный файл для чтения и записи

“w+b”

Создать двоичный файл для чтения и записи

“a+b”

Открыть двоичный файл для добавления или создать для чтения и записи

“rt”

Открыть текстовый файл для чтения

“wt”

Создать текстовый файл для записи

“at”

Открыть текстовый файл для добавления

“r+t”

Открыть текстовый файл для чтения и записи

“w+t”

Создать текстовый файл для чтения и записи

“a+t”

Открыть текстовый файл для добавления или создать для чтения и записи

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

FILE*fp;

if((fp=fopen(“test”,”r”))= =NULL)

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

return(1);

}

Константа NULL определена в заголовочном файле STDIO.H.

Для закрытия файла необходимо использовать функцию fclose().

Например, fclose(fp) в случае применения описанной выше конструкции.

Существует два типа данных, которые можно хранить в файлах- текстовая и бинарная(двоичная). С точки зрения доступа к файлам следует различать последовательный доступ(sequential)и произвольный (random).В файлах последовательного доступа информацию приходится читать с начала до конца построчно.

Для записи в текстовый файл можно использовать функцию fprintf().

Ее отличие от функции printf() состоит в том, что перед строкой формата дополнительно располагается дескриптор потока ввода-вывода (stream handle) в который производится запись.

Например, fprintf(fp,”%s\n”,”Программирование”); При этом в файл запишется одна строка.

Для чтения из текстового файла можно пользоваться функцией fgets().

Например,fgets(StrBuf,80,fp); При этом из файла будет прочитана одна строка длиной 80 символов.

Для ее печати можно использовать функцию printf().

Например, printf(“%s\n”,StrBuf); При этом будет выведено на экран содержание прочитанной строки.

При работе с файлами с последовательным доступом приходится читать их с начала и до конца и искать необходимую информацию приходится построчно. Все новые записи в такой файл помещаются в конец файла. Если потребуется внести изменения в середину файла необходимо использовать файловый указатель (file pointer), который запоминает текущую позицию в файле, с которой будет производиться очередная операция записи или чтения. Текущую позицию файлового указателя можно определить с помощью функции FTELL(),которая возвращает значение текущей позиции в файле, имеющее тип long int.

Например,POZCUR=ftell(fp);

Для установки файлового указателя в нужное место можно воспользоваться функцией FSEEK().

Например,fseek(fp,0,SEEK_SET); или

fseek(fp,(POZCUR-1),SEEK_SET);

Файлы с последовательным доступом имеют ряд недостатков. Главный из них состоит в том ,что новые записи помещаются в конец файла, поэтому для изменения в середине файла надо открыть еще один временный файл, записать в него всю информацию до того места, где производятся изменения, затем записать в него изменения, а затем скопировать в него остальную часть первого файла. После этого временный файл записывается поверх исходного, а временный файл удаляется. С этой точки зрения более предпочтительным является использование файлов с произвольным доступом. В таком файле минимальной логической единицей хранения информации является ЗАПИСЬ. Таким образом, файлы с произвольным доступом позволяют хранить записи определенной длины. Это позволяет легко определить положение (позицию) любой записи. Например, если длина записи Names равна 30 байтам, то смещение пятой записи файла от начала можно вычислить как

OffSet=(5*sizeof(Names));

ПРИЛОЖЕНИЯ

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