@a_ovchinnikov
Web developer

С/C++. Почему не сразу выводит в stdout?

Всем привет!

Сразу палками не бейте за такой дурацкий вопрос - сто лет не писал на С и тут что-то навеяло вдруг. Накидал простейший пример и немножко впал в ступор - не могу понять почему так происходит и все тут.

Идея следующая - программа считывает символ из stdin и тут же выводит его в stdout до тех пор пока не встретит конец строки.
Первая версия выглядела следующим образом:

include <stdio.h>

int main(void)
{
    char ch;

    ch = getc(stdin);
    while (ch != '\n')
    {
        printf("%c", ch);
        ch = getc(stdin);
    }

    return 0;
}


Вроде все просто и понятно, причем я ожидал, что мой ввод будет постоянно дублироваться: я ввожу букву A и тут же она выводится в stdout. Но вот после запуска программы так почему-то не произошло - код терпеливо дождался выхода из цикла и только лишь потом все вывелось на экран.

Ладно, подумал я, ведь буферизацию никто не отменял. Поэтому дальше программа стала выглядеть вот так:

include <stdio.h>

int main(void)
{
    char ch;

    ch = getc(stdin);
    while (ch != '\n')
    {
        printf("%c", ch);
        fflush(stdout);
        ch = getc(stdin);
    }

    return 0;
}


Но и после этого никаких изменений - все ровным счетом также.
Дак вот - как я понимаю C обязательно ждет завершения ввода (например, нажатием Enter). Нет ли способа решить задачу именно так, как я хотел? Чтобы ввели символ и он тут же вывелся на экран.

Всем спасибо!
  • Вопрос задан
  • 320 просмотров
Решения вопроса 1
В начале вызываем system("stty raw"); (работоспособность в windows не проверялась).

Или используйте curses:
#include <curses.h>

int main(void)
{
    initscr();
    cbreak();
    timeout(-1);

    char ch;
    while ((ch = getch()) != '\n') {
        printf("%c", ch);
        fflush(stdout);
    }

    endwin();
    return 0;
}
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
EndUser
@EndUser
Вроде где-то видел опцию синхронизации потоков консоли.
Типа en.cppreference.com/w/cpp/io/ios_base/sync_with_stdio ?
Вы точно C-компилируете?
Ответ написан
AtomKrieg
@AtomKrieg
Давай я поищу в Google за тебя
#include <windows.h>
#include <cstdio>
#include <conio.h>

int main(void)
{
	char ch;
	do
	{
		ch = getch();
		printf ( "%c", ch );
		printf ( "%c", ch ); //чтобы убедиться, отображение происходит в процессе ввода
	} while (ch != '\r'); //в конце строки приходит \r
	printf ( "%c", '\n' ); //если не сделаем перевод строки, конечное сообщение затрет строку

	system ( "pause" );
	return 0;
}
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы