Программирование PC Как прочитать текстовый файл на языке C Thu, November 21 2024  

Поделиться

Нашли опечатку?

Пожалуйста, сообщите об этом - просто выделите ошибочное слово или фразу и нажмите Shift Enter.


Как прочитать текстовый файл на языке C Печать
Добавил(а) microsin   

Cуществует несколько удобных способов прочитать содержимое файла как простой текст.

[fscanf]

int fscanf(FILE *stream, const char *format, arg-list);

Стандартная библиотечная функция fscanf() в параметре format берет массив аргументов printf/scanf, и преобразовывает с их помощью значения, прочитанные из текстового файла stream. Результаты преобразования присваиваются переменным, указанным в списке переменных arg-list. Т. е. функция работает аналогично функции scanf [2], отличие только в том, что порции текста для преобразования извлекаются не из строки, а из файла. Таким образом в текстовом файле ищутся порции текста, которые попадают под указанное форматирование в параметрах функции fscanf. На выходе функция fscanf, также как и scanf, возвратит количество успешно преобразованных переменных.

Простой пример тестовой программы test_fscanf.c:

#include < stdio.h>
 
int main()
{
   char *fn = "text_file.txt";
 
   FILE* ptr = fopen(fn, "r");
   if (ptr == NULL)
   {
      printf("Файл %s не существует.\n", fn);
      return -1;
   }
 
   char buf[100];
   while (fscanf(ptr, "%s ", buf)== 1)
      printf("%s\n", buf);
 
   return 0;
}

Например, у нас есть текстовый файл text_file.txt:

$ cat text_file.txt
Первая строка
 
Вторая строка 
Третья строка

Тогда запуск этой тестовой программы выдаст следующий результат:

$ gcc -o main test_fscanf.c
$ ./main
Первая
строка
Вторая
строка
Третья
строка

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

[fread]

Функция fread() считывает данные из файла и сохраняет их в указанный буфер.

size_t fread(void *buf, size_t size, size_t count, FILE *stream);

Функция прочитает из stream (входного потока или файла) count элементов в буфер buf, причем размер каждого прочитанного элемента равен size байт. Когда было успешно прочитано указанное count количество элементов, будет возвращено прочитанное количество, равное указанному. Если это значение отличается от указанного, то произошла ошибка, либо был достигнут конец файла.

#include < stdio.h>
 
int main ()
{
   char buffer[33];
   FILE * stream;
 
   stream = fopen("text_file.txt", "r");
   int count = fread(&buffer, sizeof(char), 33, stream);
   fclose(stream);
   printf("Из файла прочитаны данные:\n");
   printf("'%s'\n", buffer);
   printf("Количество прочитанных элементов: %d\n", count);
 
   return 0;
}

Результат работы программы test_fread.c:

$ gcc -o main test_fread.c
$ ./main
Из файла прочитаны данные:
'Первая строка
 
Вто'
Количество прочитанных элементов: 33

Обратите внимание, что количество выведенных символов явно меньше, чем количество прочитанных байт (33). Причина в том, что русские буквы были сохранены в файле формата UTF-8.

[fgets]

char *fgets(char *str, int num, FILE *stream);

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

#include < stdio.h>
 
int main ()
{
   FILE *fp;
   char str[60];
 
   fp = fopen("text_file.txt" , "r");
   if(fp == NULL)
   {
      perror("Ошибка открытия файла");
      return -1;
   }
   if(fgets (str, 100, fp) != NULL)
   {
      puts(str);
   }
   fclose(fp);
   
   return 0;
}

Результат запуска test_fgets.c:

$ gcc -o main test_fgets.c
$ ./main
Первая строка

[fgetc]

int fgetc(FILE *stream);

Функция fgtec() используется для чтения из файла stream по одному символу за вызов. Функция возвратит ASCII-код прочитанного символа. Прочитанный символ соответствует текущей позиции чтения из файла stream, и после выхода из функции эта позиция перемещается вперед по файлу, на следующий символ. Если произошла ошибка, или был достигнут конец файла, то эта функция вернет EOF (End-Of-File).

#include < stdio.h>
 
int main ()
{
   FILE *fp = fopen("text_file.txt","r");
   if (fp == NULL)
      return 0;
   
   do{
      char c = fgetc(fp);
      if (feof(fp))
         break ;
      printf("%c %02X\n", c, c);
   } while(1);
   fclose(fp);
 
   return 0;
}

Результат запуска программы test_fgetc.c:

$ gcc -o main test_fgetc.c
$ ./main
� FFFFFFD0
� FFFFFF9F
� FFFFFFD0
� FFFFFFB5
� FFFFFFD1
� FFFFFF80
� FFFFFFD0
� FFFFFFB2
� FFFFFFD0
� FFFFFFB0
� FFFFFFD1
� FFFFFF8F
  20
� FFFFFFD1
� FFFFFF81
� FFFFFFD1
� FFFFFF82
� FFFFFFD1
� FFFFFF80
� FFFFFFD0
� FFFFFFBE
� FFFFFFD0
� FFFFFFBA
� FFFFFFD0
� FFFFFFB0
 0A
 0A
� FFFFFFD0
� FFFFFF92
� FFFFFFD1
� FFFFFF82
� FFFFFFD0
� FFFFFFBE
� FFFFFFD1
� FFFFFF80
� FFFFFFD0
� FFFFFFB0
� FFFFFFD1
� FFFFFF8F
  20
� FFFFFFD1
� FFFFFF81
� FFFFFFD1
� FFFFFF82
� FFFFFFD1
� FFFFFF80
� FFFFFFD0
� FFFFFFBE
� FFFFFFD0
� FFFFFFBA
� FFFFFFD0
� FFFFFFB0
 0A
� FFFFFFD0
� FFFFFFA2
� FFFFFFD1
� FFFFFF80
� FFFFFFD0
� FFFFFFB5
� FFFFFFD1
� FFFFFF82
� FFFFFFD1
� FFFFFF8C
� FFFFFFD1
� FFFFFF8F
  20
� FFFFFFD1
� FFFFFF81
� FFFFFFD1
� FFFFFF82
� FFFFFFD1
� FFFFFF80
� FFFFFFD0
� FFFFFFBE
� FFFFFFD0
� FFFFFFBA
� FFFFFFD0
� FFFFFFB0
 0A

[Ссылки]

1. fscanf site:c-cpp.ru.
2. scanf site:c-cpp.ru.
3. fread site:c-cpp.ru.
4. fgets site:c-cpp.ru.
5. fgetc site:c-cpp.ru.

 

Добавить комментарий


Защитный код
Обновить

Top of Page