Чтение из stdin flush stdout?
stdout буферизируется по строке при подключении к терминалу, но я помню, где-то читал, что чтение (по крайней мере, из stdin) автоматически запустит stdout. Все реализации C, которые я использовал, сделали это, но теперь я не могу найти его в стандарте.
Имеет смысл, что он работает именно так, иначе код выглядит следующим образом:
printf("Type some input: ");
fgets(line, sizeof line, stdin);
потребуется дополнительная fflush(stdout);
Значит, stdout гарантированно очищается здесь?
EDIT:
Как уже говорилось в нескольких ответах, в стандарте нет гарантии, что вывод в stdout в моем примере появится перед чтением из stdin, но, с другой стороны, это намерение указано (моя бесплатная черновик ) стандарта:
Динамика входа и выхода интерактивные устройства как указано в 7.19.3. Цель эти требования заключаются в том, что небуферизованный или вывод строки с буферизацией насколько это возможно, чтобы обеспечить сообщения действительно появляются до программа ожидает ввода.
(ИСО/МЭК 9899: Проект Комитета TC2 - 6 мая 2005 г., стр. 14).
Итак, кажется, что нет никакой гарантии, но она, вероятно, будет работать в большинстве реализаций. (Знаменитые последние слова...)
Ответы
Ответ 1
Чтобы ответить на ваш вопрос, вам понадобится дополнительный fflush(stdout);
после вашего вызова printf()
, чтобы убедиться, что запрос появляется до того, как ваша программа попытается прочитать ввод. Чтение из stdin
для вас не fflush(stdout);
.
Ответ 2
Нет, это не так.
Ответ 3
Нет. Вам нужно fflush (stdout); Многие реализации будут очищены при каждой новой строке, они отправляют вывод на терминал.
Ответ 4
Нет. stdin/stdout буферизуются. Для того чтобы буферизованные данные в оконечной памяти видеопамяти /unix были вытолкнуты на устройство просмотра, такое как терминал, вам нужно объяснить fflush(stdout)
. Буферизацию данных можно установить, вызвав setvbuf
.
Изменить: Спасибо Джонатан, чтобы ответить на вопрос, чтение с stdin не сбрасывает stdout. Возможно, я отклонил тангенс, указав код, демонстрирующий, как использовать setvbuf
.
#include
int main(void)
{
FILE *input, *output;
char bufr[512];
input = fopen("file.in", "r+b");
output = fopen("file.out", "w");
/* set up input stream for minimal disk access,
using our own character buffer */
if (setvbuf(input, bufr, _IOFBF, 512) != 0)
printf("failed to set up buffer for input file\n");
else
printf("buffer set up for input file\n");
/* set up output stream for line buffering using space that
will be obtained through an indirect call to malloc */
if (setvbuf(output, NULL, _IOLBF, 132) != 0)
printf("failed to set up buffer for output file\n");
else
printf("buffer set up for output file\n");
/* perform file I/O here */
/* close files */
fclose(input);
fclose(output);
return 0;
}
Надеюсь, это поможет,
С наилучшими пожеланиями,
Том.
Ответ 5
Нет, это не часть стандарта. Конечно, возможно, что вы использовали реализацию библиотеки, где описанное вами поведение произошло, но это нестандартное расширение, на которое вы не должны полагаться.
Ответ 6
Нет. Следите за взаимоблокирующими взаимоблокировками при работе со стд-потоками при чтении на stdin или записи в блоках stdout.