Странное поведение stderr

У меня есть этот код в моей программе

while(1){
// some code here

fprintf(stdout,"Output Log");
fprintf(stderr,"Error Log");//some code here
}

Он печатает только «Журнал ошибок». Похоже, мне не хватало флеша между двумя fprintf. Поэтому я добавил «\ n» к строке «Выходной журнал». Работал нормально. Но не могу понять это странное поведение, когда я просто поменял местами два fprintf

while(1){
// some code here
fprintf(stderr,"Error Log\n");
fprintf(stdout,"Output Log");

//some code here
}

Несмотря на использование «\ n», он печатает только «Журнал ошибок».

0

Решение

Ваша ошибка заключается в том, что новая строка «между» двумя сообщениями является причиной появления обоих. Это на самом деле перевод строки в конце выход в stdout что вызывает сообщение stdout появиться (сообщение stderr всегда видно, потому что stderr небуферизован).

В любом случае, полагаться на переводы строки для очистки буфера ненадежно, если только вы не установили режим буферизации строки вручную stdout; строка с буферизацией используется только по умолчанию, когда stdout это терминал. Если вы не хотите использовать линейный или небуферизованный режим, то вы должен использование fflush чтобы получить надежное чередование вывода в stdout а также stderr,

5

Другие решения

stderr особенный. Он никогда не полностью буферизуется при запуске приложения, как stdout может быть. Это зависит от реализации относительно того, является ли он буферизованным строкой, и он может не буферизоваться вообще (как кажется здесь).

Не имеет значения, привязаны ли они к одному и тому же устройству вывода. Это имеет смысл, когда вы думаете об этом; Вы, вероятно, хотите, чтобы ваши ошибки были сброшены так быстро, как это разумно.

1

Кажется stdout буферизован и stderr не является. Поскольку программа никогда не заканчивается, буфер никогда не очищается.

1
По вопросам рекламы [email protected]