Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ЯП - ПОИТ (Бахтизин) часть 1 редакт.doc
Скачиваний:
1
Добавлен:
01.04.2025
Размер:
1.76 Mб
Скачать

10.3. Функции ввода-вывода для работы с текстовыми файлами

Для работы с текстовыми файлами в библиотеке языка Си содержится множество удобных функций, далее будут рассмотрены самые распространенные: fprintf(), fscanf(), fgets(), fputs(), fgetc(), fputc(). Формат параметров этих функций очень похож на формат функций printf(), scanf(), gets(), puts(), getc() и putc().

Схожи не только параметры, но и действия. Отличие лишь в том, что printf(), scanf() и другие работают по умолчанию с консолью (экран, клавиатура), а fprintf(), fscanf() — с файлами, поэтому у них добавлен параметр, являющийся указателем на структуру FILE, которая была рассмотрена выше.

Функции для работы с текстовыми файлами удобны для создания текстовых файлов, ведения файлов-протоколов (log-файлов) и т.п.

Прототипы вышеперечисленных функций:

int fputs(const char *cmp, FILE *file);

cmp – указатель на строку;

file – указатель на файл;

fputs() пишет в файл, указанный в file, строку, на которую указывает cmp. Возвращает код последнего записанного в файл символа. В случае возникновения ошибки – возвращается значение EOF.

int fputс(char ch, FILE *file);

ch – символ;

file – указатель на файл;

fputc() пишет в файл, указанный в file, символ ch.

Возвращаемое значение – записанный символ.

В случае возникновения ошибки – возвращается значение EOF.

char *fgets(char *cmp, int length, FILE *file);

cmp – указатель на строку;

file – указатель на файл;

Функция fgets() читает из файла file строку, и делает это до тех пор, пока не будет прочитан символ новой строки или количество прочитанных символов не будет равно length-1 либо достигнут конец файла.

При успешном выполнении функция возвращает cmp, а в случае ошибки – пустой указатель (NULL).

int fgetс(FILE *file);

file – указатель на файл;

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

В случае возникновения ошибки, либо по достижении конца файла – возвращается значение EOF.

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

Для этого нужно написать следующий код в теле программы

do

{

ch = fgetc(f); // f-указатель на файл;

}

while (ch != EOF);

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

Еще одним важным недостатком такого определения конца файла является невозможность работать с бинарными файлами.

Физически это, конечно, возможно, однако при работе с двоичным файлом может быть прочитано целое значение равное EOF.

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

Ниже приведен пример программы записи строковых данных в текстовый файл.

#include <stdio.h>

#include <conio.h> // заголовочный файл для работы функции

// очистки экрана (clrscr())

void main(void)

{

char s[25];

FILE *out;

clrscr();

out = fopen("d:\\Ex2.txt", "wt");

for (int i = 0; i < 3; i++)

{

gets(s);

fprintf(out, "%s \n", s);

}

getch();

fclose(out); // открытый файл закрывается

puts("Reading from file");

// тот же файл открывается для чтения

out = fopen("d:\\Ex2.txt", "rb");

for (i = 0; i < 3; i++)

{

fscanf(out, "%s", s);

printf("%s \n", s);

}

fclose(out);

getch();

}

В программе поочередно считываются и заносятся в файл три строки.

Если открыть созданный файл (d:\ex2.txt), к примеру редактором WORDPAD, то мы увидим, что данные располагаются точно так же, как мы видели их на экране.