Почему printf () с \ n все еще не грипп sh на Windows? - PullRequest
0 голосов
/ 25 апреля 2020

Моя Windows программа (скомпилированная с использованием MSYS2 MINGW64) выводит свои данные stdout большими блоками. printf() вызов с \n не правильно flu sh выход.

Как вариант этот вопрос , при каких условиях printf() NOT flu sh?


Например, следующий код выводится в блоках на MSYS2 MINGW64:

#include <stdio.h>

int main() {
        while(1) {
                printf("test\n");
                Sleep(1);
        }
        return 0;
}

Ответы [ 3 ]

2 голосов
/ 26 апреля 2020

при каких условиях printf() НЕ грипп sh?

С mingw-w64 , я не в курсе, пока поведение mingw-w64 не требуется применять в другом месте. Код осторожно нацелен только на одну реализацию.

В общем случае C относится следующее.

Обычно, если printf() не хватает '\n', он не грипп sh , тем не менее, это поведение, определяемое реализацией .

Условия, при которых printf() мигает или нет, определяет реализацию . Есть много возможностей. См. Каковы правила автоматической очистки буфера стандартного c в C

Чтобы убедиться, что stdout является сброшенным , выполните fflush(stdout);.

2 голосов
/ 26 апреля 2020

На Windows нет буферизации строки, только нет и полная буферизация

  • _IOLBF
    • Для некоторых систем это обеспечивает буферизацию строки. Однако для Win32 поведение аналогично _IOFBF - полная буферизация.

setvbuf

Подождите какое-то время, пока буфер не заполнится, или flu sh буфер самостоятельно. В качестве альтернативы вы можете уменьшить размер буфера с помощью setvbuf(), чтобы он чаще сбрасывался

0 голосов
/ 26 апреля 2020

В качестве дополнения к другому ответу вы можете сделать все свои выходные данные в printf, просто не делайте \n и вместо этого используйте cout << endl после него. Это достаточно гриппа sh выход.

...