Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
stdio_ВАНЯ.rtf
Скачиваний:
5
Добавлен:
20.07.2019
Размер:
588.72 Кб
Скачать

Int fclose(file* stream);

Вызов функции fclose закрывает поток, указанный аргументом stream. При этом сначала выполняется обработка буфера потока, аналогичная обращению к функции fflush, чтобы передать буферизованные, но незаписанные данные или уничтожить буферизованные, но непрочитанные данные, для потоков вывода и ввода, соответственно. После этого в структуре управления потоком освобождается область памяти, которая была динамически распределена под буфер потока, когда поток был открыт для обработки ввода-вывода. При успешном завершении функция fclose должна возвращать нулевое значение. При ошибке возвращается отрицательный код. Нужно отметить, что без веских причин не следует закрывать стандартные потоки ввода-вывода и протокола диагностики, которые адресуют указатели stdin, stdout и stderr. Они будут автоматически закрыты при завершении процесса выполнения программы.

Пример прикладной программы ввода-вывода

Комплексное применение различных библиотечных функций буферизованного ввода-вывода иллюстрирует исходный код прикладной команды cat, которая используется в операционной системе Unix для конкатенации содержимого заданных файлов в потоке стандартного вывода. Имена файлов передаются команде cat через аргументы командной строки ее вызова. Команда cat реализует стандартный вывод содержимого указанных файлов или эхо-печать потока стандартного ввода при вызове без аргументов. Если указанные файлы не существуют или недоступны для чтения, команда cat отображает соответствующую системную диагностику через стандартный поток stderr. Например, следующий вызов команды cat:

$ cat /etc/motd /etc/issue

последовательно отображает в потоке стандартного вывода содержимое файлов /etc/motd и /etc/issue файловой системы OS Unix. Исходный код упрощенной версии программы cat, где исключена обработка ключевых параметров командной строки, приведен ниже.

/* Программа конкатенации и стандартного вывода файлов */

#include <stdio.h> /* Заголовок стандартного ввода-вывода */

int main(int argc, char* argv[]) {

FILE* stream; /* Указатель потока */

int c; /* Код символа потока ввода-вывода */

int count = 0; /* Счетчик входных файлов */

int state = 0; /* Признак ошибки */

/* Обработка потока стандартного ввода */

if(argc == 1)

while((c = getchar()) != EOF)

putchar(c);

/* Цикл обработки файловых потоков ввода */

while(argv[++count] != NULL) {

if((stream = fopen(argv[count], "r")) == NULL) {

fprintf(stderr, "%s: ", argv[0]);

perror(argv[count]);

state++;

continue;

} /* if */

while((c = fgetc(stream)) != EOF)

fputc(c, stdout);

fflush(stdout);

fclose(stream);

} /* while */

return(state); /* возврат числа ошибок */

} /* main */

Приведенный вариант исходного кода команды cat можно условно разделить на две части. В первой части реализована циклическая обработка потока стандартного ввода функциями getchar и putchar. Она выполняется, если программа cat не имеет аргументов в командной строке ее вызова. Вторая часть программы cat обеспечивает обработку файловых потоков, когда при ее вызове указаны имена файлов, содержимое которых требуется отобразить в потоке стандартного вывода. Имена файлов передаются в программу cat через массив аргументов argv основной функции main. Для буферизованной обработки заданных файлов команда cat последовательно открывает потоки потоки ввода, используя вызов функции fopen. Диагностику ошибки, когда поток не может быть открыт для чтения данных из файла, предоставляет вызов функции perror. Она отображает диагностическое сообщение в потоке stderr после указания имени файла, который не существует или не может быть открыт в заданном режиме. Обработку корректно открытых файловых потоков обеспечивает циклический вызов функций fgetc и fputc для чтения символов из потока ввода и записи их в поток стандартного вывода. Цикл чтения-записи завершает вызов функций fflush и fclose, чтобы вытолкнуть остаток данных из буфера потока стандартного вывода и закрыть входной поток, освобождая его указатель для обработки следующего файла. После завершения стандартного вывода содержимого всех указанных файлов или эхо-печати потока стандартного ввода команда cat возвращает суммарное число файлов, которые не существуют или недоступны для чтения данных.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]