C: Работа с файлами

Язык C позволяет осуществлять различные операции с файлами. В большинстве случаев эти операции не связаны с какими-либо сложностями.

Открытие файлов

FILE *fp;
fp = fopen(filename, mode);

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

  • r — открытие файла для чтения с позиционированием указателя в начале файла.
  • r+ — открытие файла для чтения и записи с позиционированием указателя в начале файла.
  • w — удаление содержимого существующего файла или создание нового файла для последующей записи с позиционированием указателя в начале файла.
  • w+ — удаление содержимого существующего файла или создание нового файла для последующего чтения и записи с позиционированием указателя в начале файла.
  • a — создание или открытие существующего файла для дополнения с позиционированием указателя в конце файла.
  • a+ — создание или открытие существующего файла для чтения и дополнения с позиционированием указателя в начале файла для чтения и в конце файла для дополнения.

Закрытие файлов

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

fclose(fp);

Чтение данных из файлов

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

size_t bytesread;
char buffer[100];
bytesread = fread(buffer, sizeof(buffer), 1,  fp);

В качестве первого параметра используется указатель на буфер, в качестве второго — размер этого буфера, в качестве третьего — количество буферов для чтения, а в качестве четвертого — открытый файл. При достижении конца файла функция будет возвращать, как и в случае ошибки, нулевое значение, поэтому успешное достижение конца файла может быть установлено с помощью feof(), а возникновение ошибки — с помощью функции ferror().

feof(fp);
ferror(fp);

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

char buffer[100];
fgets(buffer, sizeof(buffer), fp);

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

Запись данных в файлы

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

size_t byteswritten;
char buffer[100];
byteswritten = fread(buffer, sizeof(buffer), 1,  fp);

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

Для записи строк в текстовый файл может использоваться функция fputs(). При работе с ней также следует подготовить буфер со строкой для записи.

char buffer[100];
fputs(buffer, sizeof(buffer), fp);

Функция возвращает количество записанных байтов или символ EOF в случае возникновения ошибки.

Переименование файлов

Файлы могут свободно переименовываться. Для этого достаточно задать текущее и новое имена интересующего файла. Функция rename() возвращает нулевое значение при удачном переименовании файла.

res = rename(old, new);

С помощью первого параметра передается текущее имя файла, с помощью второго — его новое имя.

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

Файлы также могут удаляться. Для этого достаточно задать текущее имя интересующего файла. Функция remove() возвращает нулевое значение при удачном удалении файла.

res = remove(name);

С помощью единственного параметра передается имя существующего файла.

Права доступа

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

Функция chmod() позволяет устанавливать права доступа к файлу.

chmod(filename, mode);

Параметр filename позволяет передать имя файла, права доступа к которому необходимо изменить. Параметр mode позволяет указать права доступа к файлу в восьмеричном формате.

Пример

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

  1. #include <stdio.h>
  2. #include <string.h>
  3.  
  4. #define MODEL_NAME_STR "model name      : "
  5. #define MODEL_NAME_LEN 13
  6.  
  7. int main()
  8. {
  9.     FILE *fp;
  10.     char buffer[1024];
  11.    
  12.     fp = fopen("/proc/cpuinfo", "r");
  13.    
  14.     if (fp == NULL) {
  15.         printf("Не удалось открыть файлn");
  16.         return 1;
  17.     }
  18.    
  19.     do {
  20.         memset(buffer, 0, sizeof(buffer));
  21.         if (fgets(buffer, sizeof(buffer), fp) != NULL) {
  22.             if (strstr(buffer, MODEL_NAME_STR) != NULL) {
  23.                 printf("%s", buffer + MODEL_NAME_LEN);
  24.             }
  25.         }
  26.     } while ((!feof(fp)) && (!ferror(fp)));
  27.    
  28.     fclose(fp);
  29.    
  30.     return 0;
  31. }

Загрузить исходный код примера