Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
lektsii_po_si.doc
Скачиваний:
13
Добавлен:
12.11.2018
Размер:
11.78 Mб
Скачать

7.1.2. Стандартные файлы и функции для работы с ними

Когда программа начинает выполняться, автоматически открываются пять потоков, из которых основными являются:

• стандартный поток ввода (на него ссылаются, используя предопределенный указатель на поток stdin);

• стандартный поток вывода (stdout);

• стандартный поток вывода сообщений об ошибках (stderr).

По умолчанию стандартному потоку ввода stdin ставится в соответствие клавиатура, а потокам stdout и stderr соответствует экран дисплея.

Для ввода-вывода данных с помощью стандартных потоков в библиотеке языка Си определены следующие функции:

getchar( ) putchar( ) - ввод-вывод отдельного символа;

gets( )/puts( ) - ввод-вывод строки;

scanf( )/printf( ) - ввод-вывод в режиме форматирования данных.

Ввод-вывод отдельных символов.

Ввод-вывод отдельных символов. Одним из наиболее эффективных способов осуществления ввода-вывода одного символа является использование библиотечных функций getchar( ) и putchar( ). Прототипы функций getchar( ) и putchar( ) имеют следующий вид:

int getchar(void);

int putchar(int с);

Функция getchar( ) осуществляет ввод одного символа. При обращении она возвращает в вызвавшую ее функцию один введенный символ.

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

Обратите внимание на то, что функция getchar( ) вводит очередной байт информации (символ) в виде значения типа int. Это сделано для того, чтобы гарантировать успешность распознавания ситуации "достигнут конец файла". Дело в том, что при чтении из файла с помощью функции getchar( ) может быть достигнут конец файла. В этом случае операционная система в ответ на попытку чтения символа передает функции getchar( ) значение EOF (End of File). Константа EOF определена в заголовочном файле stdio.h и в разных операционных системах имеет значение 0 или -1. Таким образом, функция getchar( ) должна иметь возможность прочитать из входного потока не только символ, но и целое значение. Именно с этой целью функция getchar() всегда возвращает значение типа int.

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

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

Строго говоря, функции getchar( ) и pulchar( ) функциями не являются, а представляют собой макросы, определенные в заголовочном файле stdio.h следующим образом:

Здесь переменная с определена как int с.

Функции getc( ) и putc( ), с помощью которых определены функции getchar( ) и putchar( ), имеют следующие прототипы:

int getc (FILE *stream);

int putc (int c, FILE *stream);

Указатели на поток, задаваемые в этих функциях в качестве параметра, при определении макросов getchar( ) и putchar( ) имеют соответственно предопределенные значения stdin (стандартный ввод) и stdout (стандартный вывод).

Интересно отметить, что функции getc( ) и putc( ), в свою очередь, также реализуются как макросы. Соответствующие строки легко найти в заголовочном файле stdio.h.

Не разбирая подробно эти макросы, заметим, что вызов библиотечной функции getc( ) приводит к чтению очередного байта информации из стандартного ввода с помощью системной функции (ее имя зависит от операционной системы) лишь в том случае, если буфер операционной системы окажется пустым. Если буфер не пуст, то в программу пользователя будет передан очередной символ из буфера, Это необходимо учитывать при работе с программой, которая использует функцию getchar() для ввода символов.

При наборе текста на клавиатуре коды символов записываются во внутренний буфер операционной системы. Одновременно они отображаются (для визуального контроля) на экране дисплея. Набранные на клавиатуре символы можно редактировать (удалять и набирать новые). Фактический перенос символов из внутреннего буфера в программу происходит при нажатии клавиши <Enter>. При этом код клавиши <Enter> также заносится во внутренний буфер. Таким образом, при нажатии на клавишу 'А' и клавишу <Enter> (завершение ввода) во внутреннем буфере оказываются: код символа 'А' и код клавиши <Enter>.

Об этом необходимо помнить, если вы рассчитываете на ввод функцией getchar( ) одиночного символа.

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

}

Сначала на экран выводится символ 'а', и работа программы приостанавливается до ввода очередного (в данном случае - любого) символа. Если, как это делается обычно, нажать, например, клавишу <q> и затем клавишу <Enter> (для завершения ввода), то на следующей строке появятся символы bc, и программа завершит свою работу. Первая (в программе) функция getchar( ) (#1) прочитала из внутреннего буфера код символа 'q', и следующая за ней функция printf( ) вывела на экран символ 'b'. Остановки работы программы не произошло, потому что вторая функция getchar( ) (#2) прочитала код клавиши <Enter> из внутреннего буфера, а не очередной символ с клавиатуры. Произошло это потому, что к моменту вызова функции getchar( ) внутренний буфер не был пуст.

Приведенная программа будет работать правильно, если в момент остановки программы нажимать только клавишу <Enter>.

Функция putchar( ) служит для вывода на устройство стандартного вывода одного символа, заданного в качестве параметра. Ниже приведены примеры задания выводимого символа:

В строке 2 фрагмента программы на экран дисплея выводится символ, введенный в предыдущей строке функцией getchar( ). В строке 3 выводится символ 'А', в строке 4 выводится управляющий символ, заданный кодом 007 (звуковой сигнал). В последней строке выводится неотображаемый (управляющий) символ табуляции, перемещающий курсор в следующую позицию табуляции. Обычно эти позиции задаются следующим числовым рядом: 1,9,17,25...

Приведем в качестве примера применения функций getchar( ) и putchar( ) программу копирования данных из стандартного ввода в стандартный вывод, которую можно найти практически в любом пособии по программированию на Си:

Эта же программа с использованием функций getc( ) и putc( ) будет выглядеть так:

Для завершения приведенной выше программы копирования необходимо ввести с клавиатуры сигнал прерывания Ctrl+C (одновременно нажать клавиши <Ctrl> и <С>).

В [1,§1.5] приведены примеры использования функций getchar( ) и putchar( ) для подсчета во входном потоке числа отдельных введенных символов, строк и слов.