Написание программ с использованием файловых операций, страница 2

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

Прототип функции fclose() выглядит следующим образом.

int fclose (FILE *fp);

Здесь параметр fp представляет собой указатель файла, возвращенный функцией fopen(). Если функция вернула нулевой указатель значит файл закрыт успешно. Значение EOF является признаком ошибки.

Запись символа

Для вывода символов предназначены 2 функции: putc() и fputc(). (На самом деле putc() – это макрос.) Эти эквивалентные функции просто сохраняют совместимость со старыми версиями языка С.

Функция putc() записывает символ в файл, открытый с помощью fopen(). Прототип этой функции выглядит так.

int putc (int символ, FILE *fp);

Если функция putc() выполнена успешно, она возвращает символ, записанный ею в файл. Иначе – EOF.

Чтение символа

Ввод символа осуществляется двумя эквивалентными функциями getc() и fgetc(). Наличие одинаковых функций позволяет сохранить совместимость со старыми версиями языка С.

Прототип функции getc() имеет следующий вид.

int getc (FILE *fp);

Если при чтении обнаруживается конец файла, функция getc() возвращает константу EOF. Однако функция getc() возвращает константу EOF и при возникновении ошибок. Для распознавания ошибки можно применять функцию ferror().

int feof (FILE *fp); // - распознавание конца файла (да – истина, нет – 0);

7.160101.3381.02.08

Лист

5

Зм.

Лист

№ док

Подпись

Дата

Работа со строками: функции fputs() и fgets()

Эти функции аналогичны функциям getc() и putc(), однако они считывают и записывают строки, а не отдельные символы. Проотипы:

int fputs(const char *строка, FILE *fp);

char *fgets(char *строка, int длина, FILE *fp);

Функция fputs() записывает в заданный поток строку, на которую ссылается указатель строка. При возникновении ошибки она возвращает константу EOF.

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

Функция rewind()

Функция rewind() устанавливает курсор в начало файла, заданного в качестве ее аргумента. Иными словами, она «перематывает» (rewind) файл в начало. Прототип:

void rewind (FILE *fp);

Функция ferror()

Функция ferror() определяет, возникла ли ошибка при работе с файлом. Прототип:

int ferror(FILE *fp);

Здесь параметр fp является допустимым указателем файла. Функция возвращает истинное значение, если при выполнении операции возникла ошибка, в противном случае она возвращает 0. Поскольку с каждой операцией над файлом связан определенный набор ошибок, функцию ferror() следует вызывать сразу же после выполнения операции, в противном случае ошибка может быть упущена.

Удаление файла

Функция remove() удаляет указанный файл. Прототип:

int remove (const char *имя_файла);

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

7.160101.3381.02.08

Лист

6

Зм.

Лист

№ док

Подпись

Дата

Очистка потока

Для того чтобы очистить поток вывода, следует применять функцию fflush().

int fflush (FILE *fp);

Эта функция записывает содержимое буфера в файл, связанный с указателем fp. Если вызвать функцию fflush() с нулевым аргументом, данные, содержащиеся в буферах, будут записаны во все файлы, открытые для записи.

В случае успешного выполнения функция fflush() возвращает 0, иначе – EOF.

Функции fread() и fwrite()

Для чтения и записи данных, размер типа которых превышает 1 байт, файловая система языка С содержит две функции: fread() и fwrite(). Эти функции позволяют считывать и записывать блоки данных любого типа. Прототипы:

size_t fread (void *буфер, size_t количество_байтов, size_t количество_блоков, FILE *fp);

size_t fwrite (const void *буфер, size_t количество_байтов, size_t количество_блоков, FILE *fp);

В прототипе функции fread() параметр буфер представляет собой указатель на область памяти, в которую записываются данные, считанные из файла. В прототипе функции fwrite() параметр буфер представляет собой указатель на область памяти, содержащую данные, которые должны быть записаны в файл. Значение параметра количество_блоков определяет сколько блоков подлежит считыванию или записи. Длина блоков задается параметром количество_байтов.

Функция fread() возвращает количество считанных блоков. Оно может быть меньше параметра количество_блоков, если обнаружен конец файла или возникла ошибка. Функция fwrite() возвращает количество фактически записанных блоков.

Функция fseek()

С помощью функции fseek() можно осуществлять операции ввода и вывода данных, используя файла с произвольным доступом. Эта функция устанавливает курсор файла в заданную позицию. Прототип:

int fseek(FILE *fp, long int смещение ,int начало);

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

7.160101.3381.02.08

Лист

7

Зм.

Лист

№ док

Подпись

Дата

Начало отсчета

Имя макроса

Начало файла

SEEK_SET

Текущая позиция

SEEK_CUR

Конец файла

SEEK_END

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

Если функция выполнена успешно, она возвращает значение 0, иначе – не ноль.

Функции fprintf() и fscanf()

Эти функции совершенно аналогичны функциям printf() и scanf(). За исклячением одного – они работают с файлами. Прототипы:

int fprintf (FILE *fp, const char *управляющая_строка, …);

int fscaf (FILE *fp, const char *управляющая_строка, …);

Здесь параметр fp представляет собой указатель файла. Функции fprintf() и fscanf() выполняют операции ввода-вывода с файлом, на который ссылается указатель.

Пример:

#include <stdio.h>

#include <stdlib.h>

#include <io.h>

int main (void)

{

  FILE *fp;

  char s[80];

  int t;

  if ((fp=fopen(“test”,”w”))==NULL) {

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

    exit (1);

  }

printf (“введите строку и целое число: “);

fscanf (stdin, “%s%d”, s, &t); // считываем данные с клавиатуры

fprintf (fp,”%s %d”, s, t); // записываем их в файл

fclose (fp);

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

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

  exit (1);

  }

fscanf (fp,”%s%d”, s, &t); // считываем данные из файла

fprintf (stdout, “%s %d”, s, t); // выводим их на экран

return 0;

}

7.160101.3381.02.08

Лист

8

Зм.

Лист

№ док

Подпись

Дата