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

Int fgetc(file* stream);

При каждом обращении функция fgetc возвращает код очередного символа из потока ввода, который адресует аргумент stream. Когда достигнут конец потока или при обнаружении ошибки чтения, функция fgetc возвращает значение константы EOF. Следует отметить, что возврат функции fgetc не позволяет различать состояния ошибки и конца потока ввода также как и возврат других функций типа get, которые рассмотрены ниже.

Вместо функции fgetc можно использовать макрос getc, эквивалентный по типу аргумента и кода возврата. Его аргумент не должен быть выражением с побочными эффектами. Для чтения символов из потока стандартного ввода предусмотрен макрос getchar, который не имеет аргументов и эквивалентен вызову функции getc с аргументом stdin.

Если хотя бы один символ был прочитан, можно вернуть произвольное число символов обратно в поток ввода, используя функцию ungetc. Спецификация формата ее вызова имеет вид:

Int ungetc(int sym, file* stream);

Аргумент sym обозначает код символа, который необходимо вернуть в поток ввода, специфицированный указателем stream. Возвращенные символы могут быть прочитаны последовательными операциями ввода в порядке, обратном их возврату в поток. При успешном завершении функция ungetc возвращает код символа, который был записан обратно в поток ввода. В случае ошибки возвращается значение константы EOF. Использование функции ungetc поясняет исходный код, оформленный в виде прикладной процедуры skipspaces, которая должна обеспечивать пропуск начальных пробелов потока стандартного ввода:

/* Пропуск начальных пробелов потока ввода */

void skipspaces() {

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

/* Чтение начальных пробелов потока */

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

if(c != ' ')

break;

/* Возврат в поток первого непробела */

if(c != EOF)

ungetc(c, stdin);

} /* skipspaces */

Наиболее универсальный вариант записи отдельных символов в поток вывода предоставляет функция fputc. Спецификация формата ее вызова имеет вид:

Int fputc(int sym, file* stream);

Каждый вызов функции fputc обеспечивает запись кода символа, который определяет аргумент sym, в поток, специфицированный аргументом stream. При успехе записи функция fputc возвращает код записанного символа. Код возврата функции fputc при ошибке записи определяет значение константы EOF.

Вместо функции fputc можно использовать макрос putc, эквивалентный по типу аргументов и кода возврата. Его аргументы не должны быть заданы с помощью выражений, которые имеют побочный эффект. Для записи символов в поток стандартного вывода предусмотрен макрос putchar. В спецификации его вызова предусмотрен только один аргумент, через который передается код записываемого символа. Обращение к макросу putchar эквивалентно вызову putc, в котором указатель потока (stream) имеет значение stdout.

Использование функций ввода-вывода символов иллюстрирует исходный код прикладной программы-фильтра, которая реализует побайтное копирование потока стандартного ввода в поток стандартного вывода, исключая коды возврата каретки '\r':

/* Фильтр возврата коретки */

#include <stdio.h>

int main() {

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

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

if(c != '\r')

putchar(c);

return(0);

} /* main */

Эта программа-фильтр может быть полезна для преобразования текстовых файлов в формате MS-DOS, где каждую строку принято завершать кодовой парой \r\n, в формат OS UNIX, где строку завершает только символ перевода строки с кодом '\n', а возврат каретки гарантируют установки терминала.

Чтение строк символов из файловых потоков, которые открыты для обработки текстовых файлов, реализует функция fgets. Спецификация формата ее вызова имеет вид:

char* fgets(char* string, int len, FILE* stream);

Каждое обращение к функции fgets позволяет получить из потока, который специфицирует указатель stream, не более, чем (len - 1) символов. Ввод прекращается, если прочитан символ перевода строки или достигнут конец потока. Полученные символы, включая символ перевода строки, если он был прочитан, передаются в массив, который адресует аргумент string функции fgets. Набор символов в массиве автоматически дополняет символ, который имеет нулевой код '\0'. Поэтому для корректного сохранения прочитанных данных необходимо распределить символьный массив, длиной не меньше, чем задает аргумент len, чтобы избежать ошибки нарушения границ сегментов адресного пространства пространства процесса выполнения программы.

Чтение строк символов из потока стандартного ввода обеспечивает функция gets. Спецификация формата ее вызова имеет:

char* gets(char* string);

Каждое обращение к функции gets считывает из потока стандартного ввода все символы до символа перевода строки включительно. Полученные данные сохраняет символьный массив, который адресует аргумент string. Символ перевода строки в массиве автоматически заменяет нулевой код ('\0'). Размер массива не должен быть выбран не меньше, чем длина строки потока стандартного ввода.

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

Запись строки символов в файловый поток обеспечивает функция fputs. Спецификация формата ее вызова имеет вид:

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