2025-04-12 01:48:01

Урок 8. Буферный ввод - вывод.

В момент запуска программ на языке Си автоматически запускаются стандартный поток ввода(stdin), стандартный тоток вывода(stdout) и стандартный поток вывода сообщений об ошибках(stderr). Стандартный поток ввода stdin по умолчанию соответствует клавиатуре, а потоки stdout и stderr - экрану монитора.

Для ввода и вывода информации в этих потоках существует несколько функций:

  • getchar(): ввод с клавиатуры одного символа

  • putchar(): вывод на консоль одного символа

  • fgets(): ввод одной строки

  • puts() / fputs(): вывод одной строки на консоль

  • scanf(): ввод с консоли с форматированием данных

  • sscanf(): ввод с из строки с форматированием данных

  • printf(): вывод с форматированием данных

Функции scanf() и printf() уже рассматривались на 4 уроке, поэтому остановимся на работе остальных функций. 

Системные вызовы чтения или записи являются дорогими операциями и если оперировать одиночными символами, то такой код будет работать очень медленно. Поэтому, на практике, при операциях ввода-вывода выделяется специальная область временной памяти (буфер), куда сначала записываются поступающие символы, а как только поступает специальный сигнал(например, переход на новую строку при нажатии кнопки Enter), происходит один системный вызов cin/cout  и данные из буфера передаются по месту своего назначения (на экран, в переменную и др.).

Ввод и вывод одиночных символов.

Для ввода и вывода одиночных символов используются макросы getchar() и putchar(), прописанные в заголовочном файле stdio.h:

#define getchar()   getc(stdin)
#define putchar(c)  putc((c), stdout)

Для вывода отдельного символа в стандартный поток вывода предназначена функция putchar() со следующим прототипом:

int putchar( int c);

Выводимый символ в виде числового кода передается в putchar в качестве параметра, он же возвращается функцией.

Для ввода одного символа с клавиатуры применяется макрос getchar(), который имеет следующий прототип:

int getchar( void );

В качестве результата функция возвращает числовой код введенного символа.

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

#include <stdio.h>
int main( void )
{
    printf("1");
    getchar(); // ожидание ввода символа
    printf("2");
    getchar(); // ожидание ввода символа
    printf("3");
    return 0;
}

Ввод и вывод строк.

Вывести одну строку на консоль можно при помощи функции puts():

int putchar( char *s);

В качестве параметра передается указатель на выводимую строку.  Функция либо возвращает ноль, означающий конец строки, либо ее результат будет неопределённым. 

Также, для вывода строк можно использовать функцию fputs():

int fputs( const char *s, FILE *stream);

Первым параметром функция принимает ссылку на строку, а вторым - указатель на поток вывода(для записи в стандартный поток указывается параметр stdout). В качестве результата функция возвращает неотрицательное целое число. Если в процессе записи возникают ошибки, то возвращается значение EOF. Пример:

#include <stdio.h>
   
int main(void)
{
    fputs("Hello World\n", stdout);
    return 0;
}

Для ввода строки с клавиатуры можно использовать функцию fgets(), которая имеет следующий прототип:

char *fgets(char *str, int count, FILE *stream);

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

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

#include <stdio.h>
#define MAX 15
 
int main(void)
{
    char name[MAX];
    printf("Enter name: ");
    if(fgets(name, MAX, stdin) != NULL)
    // if(fgets(name, MAX, stdin)) - можно сократить
    {
        printf("Your name: %s\n", name);
    }
    else
    {
        printf("Critical Error!!!");
    }
    return 0;
}

 

 

Комментарии ()