Чтение из 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.