[Язык 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");
}

 

 

This entry was posted in С (Си). Bookmark the permalink.

Leave a Reply

Your email address will not be published. Required fields are marked *