небуферизованный поток ведет себя как буферизованная строка

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

#include<stdio.h>


int main()
{

setvbuf(stdin, NULL, _IONBF, 40);
setvbuf(stdout, NULL, _IONBF, 40);
while(1)
{
char a[40];
int n;
n=fread(a, 1, 4, stdin);

if(n>0)
fwrite(a, 1, n, stdout);
}
return 0;
}

поэтому я думаю, что, поскольку это небуферизованные потоки, ввод должен быть отправлен на стандартный вывод, как только я пишу на экран... но программа ждала, пока я нажму клавишу ввода после записи каждой строки, а затем на экране появился только вывод (как результат fwrite)... мой вопрос в том, почему программа ждала ввода (т.е. новой строки), когда это были небуферизованные потоки...


person AvinashK    schedule 20.06.2012    source источник


Ответы (1)


Я считаю, что это связано с тем, как работает оболочка в вашей среде: введенные вами данные недоступны в stdin, пока вы не нажмете Enter, поэтому fread блокируется, пока не сможет что-то прочитать из потока.

Подумайте, как бы вам пришлось обрабатывать backspace и тому подобное, если бы оболочка передавала каждый символ в буфер

person Attila    schedule 20.06.2012
comment
@attila ... но теоретически введенные символы должны быть немедленно переданы в файл ... не так ли? - person AvinashK; 20.06.2012
comment
@avinash - о каком файле ты говоришь? stdin ведет себя так, как если бы это был файл (для целей вызова различных функций), но это не файл. Кроме того, я не знаю среды, в которой было бы выгодно передавать введенные символы сразу на стандартный ввод (речь о непосредственном взаимодействии с пользователем). - person Attila; 21.06.2012
comment
@attila ... здесь я называю все, что представлено файловым потоком, файлом ... а также я не говорю о преимуществе ... я просто спрашиваю, так ли это. - person AvinashK; 21.06.2012
comment
@avinash - как я уже упоминал, это зависит от оболочки (которая находится между пользователем и stdin программы), и я не знаю оболочки, которая будет передавать символы по мере их ввода (но это, безусловно, возможно) . Если вы хотите сделать это, вам придется взглянуть на библиотеки, которые обеспечивают этот уровень взаимодействия (с использованием вызовов ОС более низкого уровня), например, библиотеку ncurses. - person Attila; 21.06.2012