Восьмая глава в книжке Стивена Прата “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;
}
Ну надо с чего-то начинать 🙂 Это программа, которая дается в разделе «Организация меню»; я ее написал без подсматриваний, чтобы хоть немного вспомнить что и как.
Итак, продолжаем…

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