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