Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Файлы.docx
Скачиваний:
1
Добавлен:
05.09.2019
Размер:
32.98 Кб
Скачать

Тема № 13. Работа с файлами в Си.

План:

  1. Стандартные библиотечные функции

  2. Ввод-вывод файла

Как при чтении, так и при записи информации в файл, его нужно открыть с помощью стандартной библиотечной функции fopen. Обращение к fopen в программе выполняется так:

fp = fopen (name, mode);

первый параметр – имя файла, строка символов, второй параметр – mode также строка символов, указывающая, как будет использоваться файл. Ниже приводятся основные способы применения файла:

«r» – файл нужно читать,

«w» – файл нужно записать,

«а» – файл нужно дополнить,

«r+» – открыть файл одновременно для чтения и записи (файл доллжен существовать),

«w+» – открыть пустой файл для чтения и записи (если этот файл ранеее сеществовал, его содержимое уничтожается),

«а+» – открыть фал для чтения и добавления (если файла нет, то вначале он создается).

При применении «r» открывается существующий файл. При попытке прочитать несуществующий файл – ошибка. При обнаружении ошибки fopen выдает нулевую ссылку со значением NULL. При применении «w» или «а» открывается файл для записи или дополнения, но если такого файла нет, он будет создан.

Внимание. Если используется «w» для существующего файла, то старая версия его стирается.

Третий параметр является указателем на файл; это значение возвращается функцией:

FILE *fp;

fp = fopen (“dann” , “r”);

Теперь fp является указателем на файл “dann”. С этого момента программа ссылается на файл при помощи указателя fp, а не по имени “dann”. Необходимо отметить: функция fopen ( ) возвращает указатель на ‘FILE’ в качестве аргумент; fopen () как функци указателя на ‘FILE’ не объявляется, т.к. это описание содержится в stdio.h:

FILE * fopen ();

Пример:

main ();

{ FILE *fp;

int ch;

if ((fp = fopen (“dann” , “r”)) ! = NULL)

{ while ((ch = getc (fp) ! = EOF) /* получение символа из файла, на который указывает fp*/

putch (ch, stdout); /*записывается символ ch в файл, на который ссылается */

/* указатель stdout, stdout – указатель на стандартный вызов */

fclose (fp); }

else

printf (“ файл не открыт \ n ”); }

Если fopen () не может открыть файл, она возвращает значение ‘NULL’ (в stdio.h определенное как 0).

fclose () – закрыть файл.

fclose (fp) – аргумент, fp – указатель на файл.

Можно проверить, успешно ли закрыт файл. Функция fclose () возвращает значение 0, если файл закрыт успешно, и – 1 в противном случае.

Ввод-вывод файла:

fprintf (), fscanf ()

Эти функции аналогичны функция printf () и scanf (), но в данном случае необходимо указать ссылку на файл.

main ()

{ FILE *fp;

int m;

fp = fopen (“dann1” , “ r ”);

fscanf (fp, “% d” , &m);

fclose (fp);

fp = fopen (“dann2”, “a”);

fprintf (fp, “ % d \ n“ , m);

fclose (fp);

- - - - - - - - }

Рассмотрим следующие функции

fgets (), fputs (), fread (), fwrite ().

1. fgets ( )

char * fgets (string, n, stream);

char * string;

int n;

FILE * stream;

Функция fgets () читает строку из входного потока stream и помещает ее в строку, адрес которой задается значением параметра string. Символы читаются из потока до тех пор, пока не будет прочитан символ новой строки (‘ \ n’ ), который включается в строку, или пока не наступит конец потока, или пока не будет прочитано (n-1) символов. Результат помещается в string и заканчивается нулевым символом (‘ \ 0 ’). Если n=1, то формируется пустая строка (возвращается адрес строки; значение NULL, если произошла ошибка или достигнут конец файла).

2. fputs ( )

int fputs (string, stream);

char * string;

FILE * stream;

Функция копирует строку string в поток stream с текущей позиции. Завершающийся нулевой символ (‘ \ 0 ‘) не копируется (возвращаемое значение: последний записанный символ; значение 0, если строка string пустая; значение EOF, если произошла ошибка).

3. fread ( )

int fread (buffer, size, count, stream);

void * buffer;

size-t size;

size-t count;

FILE * stream;

Функция читает count элементов длины sizе из входного потока stream и помещает их в заданный массив buffer. Указатель файла, связанный с потоком stream, увеличивается на число действительно прочитанных байтов. Форматных преобразований данных (как для функции fscanf ()) не производится. Символы перевода строки (‘ \ n ‘) специально (как для fgets ()) не обрабатываются. (Возвращаемое значение: количество действительно прочитанных элементов, которое может быть меньше, чем count, если встретилась ошибка или конец файла раньше, чем было прочитано count элементов. )

4. fwrite ( )

int fwrite (buffer, size, count, stream);

сhar * buffer;

int size;

int count;

FILE * stream;

Функция дописывает count записей по size байтов из области buffer в выходной поток stream (высокоуровневый ввод/вывод). Указатель файла (имеется в виду внутренний указатель), связанный с потоком stream, увеличивается на число записанных байтов. Форматных преобразований данных (как для fprintf ()) не производится. Символы перевода строки (‘ \ n ’) специально (как для fputs) не обрабатываются. (Возвращаемое значение: количество реально помещенных в файл записей; это число может быть меньше, чем значение count, если имела место ошибка.)

5. fseek ( )

int fseek (stream, offset, origin);

FILE * stream;

long offset;

int origin;

Функция перемещает (внутренний) указатель файла, связанного с потоком stream, на новое место в файле, которое вычисляется по смещению offset и указанию направления отсчета origin. Следующая операция ввода/вывода с указанным потоком stream будет выполнена, начиная с той позиции, на которую произведено перемещение.

Практика

Файлы в языке С.

Цель работы:

Изучить способы создания и работы с файлами в языке С.

Краткие теоретические сведения.

Файл – это набор данных, размещенный на внешнем носителе и рассматриваемый в процессе обработки и пересылке как единое целое.

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

В алгоритмическом языке «С» это делает функция fopen. Она связывает физический файл на носителе, например B:\LR7.CPP, с логическим именем в программе. Логическое имя – это указатель на файл, т.е. на область памяти, где храниться информация о файле. Указатели на файлы необходимо объявлять. Формат объявления такого указателя следующий:

FILE *указатель на файл;

Например.

FILE *f;

f=fopen ("B:\LR7.СPP", "w");

Символ "w" определяет право доступа к открываемому файлу. В данном случае открывается файл LR7.СPP на диске B:\ только для чтения.

В «С» используются следующие коды, устанавливающие режимы доступа к открываемым файлам:

Символ

Описание

R

Файл открывается только для чтения. Если нужного файла на диске нет, то возникает ошибка.

W

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

A

Файл открывается для дозаписи в его конец новой информации.

r+

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

w+

То же, что и для r+.

a+

То же, что и для a, только запись можно выполнять в любое место файла. Доступно и чтение файла.

T

Файл открывается в текстовом режиме. Указывается поле r, w, a, r+, w+, a+.

B

Файл открывается в двоичном режиме. Указывается поле r, w, a, r+, w+, a+.

Текстовый режим отличается от двоичного тем, что при открытии файла как текстового пара символов « перевод-строки», «возврат каретки» заменяется на один символ: « перевод-строки» для всех функций записи даныых в файл, а для всех функций вывода символ «перевод-строки» теперь заменяется на два символа: « перевод-строки»,«возврат каретки».

По умолчанию файл открывается в текстовом режиме.

После работы с файлом, доступ к файлу необходимо закрыть. Закрывает файл в языке С функция flose. Например, из предыдущего примераее закрывается так: fclose (f);

Для открытия нескольких файлов введена функция, объявленная следующим образом: Void fcloseall(Void);

Если требуется изменить режим доступа к файлу, то для этого сначала необходимо закрыть данный файл, а затем вновь его открыть, но с другими правами доступа. Для этого используют стандартную функцию freopen, описанную в stdio.h как FILE* freopen (char filename, chov*mode, FILE *stream). Эта функция сначала закрывает файл, связанный с потоком stream (как это делает функция fopen), а затем открывает файл с именем filename и правами доступа mode, записывая информацию об этом файле в переменную stream.

В алгоритмическом языке С имеется возможность работы с временными файлами, т.е. с такими, которые нужны только в процессе работы программы и которые надо удалить после выполнения части вычислений. в этом случае используют функцию tmpfile со следующим объявлением: FILE* tmpfile (void).

Функция tmpfile создает на диске временный файл с правами доступа «w+b» и возвращает указатель на управляющий блок по типу атрибута FILE. После завершения работы программы или после закрытия временного файла он автоматически удаляется из диска.

Все действия по чтению/записи данных в файл можно разделить на три группы:

  1. Операции посимвольного ввода-вывода,

  2. Операции построчного ввода-вывода,

  3. Операции ввода-вывода по блокам.

Ниже приведены основные функции, применяемые в каждой из указанных трех групп операций.