Главная :: Программы для программирования :: Программирование в Си :: Работа с текстовыми файлами
Программиста спрашивают: Скажите пожалуиста, который час? Программист: Который час, если вас это прикалывает девушка.

Работа с текстовыми файлами

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

Рассмотрим рабочий пример, в котором мы сначала создаем текстовый файл, записываем в него данный, а затем считываем данные из этого файла.

#include "stdio.h"
#include "math.h"

int main(){
// Создание / открытие файла
  FILE * fo;
  fo = fopen("file.txt", "wt");
// Запись в файл
  fprintf(fo, "Пример создания текстового файла\n");
  int i;
  const int N = 20;
  float x, f;
  for ( i = 0; i <= N; i++) {
    x = (float) i / N;
    f = pow(x,2);
    fprintf(fo, "%f%f", x, f);
  }
  fclose(fo);
// Чтение из файла
  FILE * fi;
  if ( (fi = fopen("file.txt", "rt")) == 0 ) {
    printf("Файл \"file.txt\" не найден!\n");
    return 1;
  }
  while ( !feof(fi) ) {
    //fscanf(fi, "x = %6.4f; x^2 = %6.4f\n", x, f);
    fscanf(fi, "%f%f", x, f);
    printf("Прочитано: x = %6.4f; f = %6.4f\n", x, f); 
  }
  fclose(fi);
  return 0;
}

Разберем этот пример подробнее. Первая строка подключает библиотеку для работы со стандартным вводом и выводом и для работы с файлами stdio.h. Вторая строка подключает математическую библиотеку math.h, необходимую для использования оператора возведения в степень pow (для работы с файлами это не нужно, но зачем ограничивать свои знания).

Создаем идентификатор связанный с файлом и открываем текстовый файл (опция t) для записи (опция w) оператором fopen.

  FILE * fo;
  fo = fopen("file.txt", "wt");

Для записи данных используем оператор форматной записи в файл fprintf. Первым параметром указывается идентификатор имени файла, вторым - строка формата данных и затем список записываемых переменных.

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

Для открытия файла используется следующая конструкция

  FILE * fi;
  if ( (fi = fopen("file.txt", "rt")) == 0 ) {
    printf("Файл \"file.txt\" не найден!\n");
    return 1;

Вначале создается идентификатор имени файла, после файл открывается оператором fopen за чтения (опция r) как текстовый файл (опция t). Оператор открытия файла располагается внутри условного оператора. Это делается для того, чтобы проверить код ошибки, возвращаемый оператором fopen. Если код ошибки отличен от 0, то файл не может быть открыт (например, если файл не существует) и программа завершается с кодом ошибки 1 (можете указать любой код, отличный от нуля). Если открытие файла прошло успешно, то выполнение программы продолжится.

Чтение данных из файла производится с помощью оператора fscanf.

Для записи данных используем оператор форматной записи в файл fprintf. Первым параметром указывается идентификатор имени файла, вторым - строка формата данных и затем список считываемых переменных.

Для проверки загруженные из файла данные выводим в консоль оператором форматного вывода printf. Закрываем файл оператором fclose и завершаем программу return 0.

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

  FILE * fo;
  if ( fo = fopen("file.txt", "wt") ) ...