У меня есть этот код в моей программе
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», он печатает только «Журнал ошибок».
Ваша ошибка заключается в том, что новая строка «между» двумя сообщениями является причиной появления обоих. Это на самом деле перевод строки в конце выход в stdout
что вызывает сообщение stdout
появиться (сообщение stderr
всегда видно, потому что stderr
небуферизован).
В любом случае, полагаться на переводы строки для очистки буфера ненадежно, если только вы не установили режим буферизации строки вручную stdout
; строка с буферизацией используется только по умолчанию, когда stdout
это терминал. Если вы не хотите использовать линейный или небуферизованный режим, то вы должен использование fflush
чтобы получить надежное чередование вывода в stdout
а также stderr
,
stderr
особенный. Он никогда не полностью буферизуется при запуске приложения, как stdout
может быть. Это зависит от реализации относительно того, является ли он буферизованным строкой, и он может не буферизоваться вообще (как кажется здесь).
Не имеет значения, привязаны ли они к одному и тому же устройству вывода. Это имеет смысл, когда вы думаете об этом; Вы, вероятно, хотите, чтобы ваши ошибки были сброшены так быстро, как это разумно.
Кажется stdout
буферизован и stderr
не является. Поскольку программа никогда не заканчивается, буфер никогда не очищается.