[Язык C] Символьный ввод-вывод и перенаправление (глава 8)


Восьмая глава в книжке Стивена Прата “C Primer Plus” (в новой редакции она называется «Символьный ввод-вывод и проверка достоверности ввода«).

EOF (end of file) — обозначение конца файла. Ctrl+Z в Windows, Ctrl+D в UNIX.

Пользователи особо не задумываются о том, как работают текстовые процессоры, вроде блокнота или ворда. А они работают благодаря т.н. эхо-выводу ввода (echoing the input), пример:

#include <stdio.h>
int main(void)
{
int ch;
while ((ch = getchar()) != EOF) // work until ^Z (Ctrl+Z)
    putchar (ch) ;
return 0;
}

Виды ввода:

  • Буферизированный ввод (хранит ввод в буфере и к нему можно обращаться после непосредственно ввода; в том числе посимвольно, например, при помощи scanf)
    • полностью буферированный ввод-вывод — буфер сбрасывается (его содержимое отправляется в место назначения), когда он полон; обычно при файловом вводе. Размер буфера зависит от системы, но наиболее распространены значения 512 и 4096 байтов.
    • пос­трочно буферизированный ввод-вывод — сбрасывается, когда появляется символ новой строки.
  • Небуферизированный (прямой) ввод (по дефолту на некоторых старых системах; вводимый текст может отображаться на экране немедленно; применяется для интерактивных приложений, когда нужно, чтобы команда выполнялась сразу же после нажатия клавиши, например, в играх)

С появлением ANSI C переключение на небуферизованный ввод более не осуществляется в языке и зависит от конкретной операционной системы (есть setbuf и setvbuf, но там ограничения).

Перенаправление ввода и вывода и файлы

Вывод в файл (>) prog >file1
Ввод из файл (<) prog <file2
Комбинированное перенаправление
prog <file2 >file1
prog >file1 <file2

Тут я заканчиваю конспект и хочу перейти к примеру программ.

Программа угадывания чисел: вы выбираете число, а компью­тер пытается его угадать.. для начала самым допотопным способом.

Первый нубский вариант реализации, в котором я сделал море лишнего:

// PC is trying to guess a number. is it 6? -> n -> ++
#include <stdio.h>
int main (void)
{

int x=6;
int n=0;
char ch;

printf("I'll try to guess your number. 'y' if I'm right,\
'n' if I'm wrong\n");

while (1)
{
 printf("Is it %d?\n", n);
 while ((ch = getchar()) == '\n')
    continue;
 if (ch == 'y')
 {
    printf("Hurray!\n");
    getchar();getchar();
    return 0;
 }
 if (ch != 'y')
    n++;
}
getchar();
}

Уберем лапшу:

#include <stdio.h>
int main (void)
{

int n=1;

printf("I'll try to guess your number. Say 'y' if I'm right\n");
printf("Hm.. Let me think.. Is it %d?\n");
while (getchar() != 'y')
{   while (getchar() != '\n')
        continue;
    printf("Is it %d?\n", ++n);
}
printf("Hurray! I did it!\n");

getchar();
return 0;
}

Вариант, с y\n через условие я добавлять не стал, т.к. на мой взгляд сейчас программа работает интереснее (впрочем, это делается элементарно).

Далее… программа, которая выводит символы в строках и столбцах:

/* Enter a character and two integers:
c 1 2
cc
Enter another character and two integers;
Enter a newline to quit.
... */

#include <stdio.h>
#include <ctype.h>

void display (char ch, int rows, int cols);

int main (void)
{

int ch;
int rows, cols;

printf("Enter a character and two integers:\n");

while ((ch = getchar()) != EOF)
{
 if (!isspace(ch))
  {
    if (scanf("%d %d", &rows, &cols) != 2)
        break;
    display (ch, rows, cols);
    printf("Another values or EOF sequence to quit:\n");
  }
}

getchar();
return 0;
}

void display (char ch, int rows, int cols)
{

int n, i;

 for (n = 0; n<rows; n++)
    {
     for (i = 0; i<cols; i++)
         printf("%c", ch);
     printf("\n");
    }
 printf("\n");
}

……

Кхм… В этом месте я сделал паузу на месяц. Месяц не занимался программированием. О чем записал видео:

(скоро тут будет ссылка на видео)

Сейчас вернулся (это адски тяжело) и моя первая программа:

#include <stdio.h>
#include <ctype.h>

int main (void)
{

char ch;

printf("How are you?\n");
printf("a) super    b) good\n");
printf("c) not bad  d) so so..\n");
printf("'q' to quit :)\n");

while ((ch = getchar()) != 'q')
{
    if (isspace(ch))
        continue;

    switch (ch)
        {
        case 'a':
            printf ("Yay!\n");
            break;
        case 'b':
            printf ("Fun :)\n");
            break;
        case 'c':
            printf ("Ok. \n");
            break;
        case 'd':
            printf ("Sad..\n");
            break;
        default:
            printf ("Enter something else please..\n");
            break;
        }

    printf("How are you?\n");
    printf("a) super    b) good\n");
    printf("c) not bad  d) so so..\n");
    printf("'q' to quit :)\n");

}

return 0;
}

Ну надо с чего-то начинать 🙂 Это программа, которая дается в разделе «Организация меню»; я ее написал без подсматриваний, чтобы хоть немного вспомнить что и как.

Итак, продолжаем…


Запись опубликована в рубрике С (Си). Добавьте в закладки постоянную ссылку.

2 комментария на «[Язык C] Символьный ввод-вывод и перенаправление (глава 8)»

  1. tip говорит:

    Жаль что забросил эту книгу, я шел по ней вместе с тобой

Добавить комментарий

🇬🇧 Attention! Comments with URLs/email are not allowed.
🇷🇺 Комментарии со ссылками/email удаляются автоматически.