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]
Функция 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. |