C: perror, порядок вывода stdout - PullRequest
0 голосов
/ 08 января 2012

Код

printf("Doing functionname... ");
if (functionname(args) == -1)
{
    perror("functionname");
}
else
{
    printf("ok\n");
}

Ожидаемое поведение

Выполнение имени функции ... ок

OR

Doing functionname ... functionname: Ошибка, бла-бла

Фактическое поведение

Однако stderr и stdout - это разные выходные потоки, поэтому результат выглядит следующим образом:

имя функции: ошибка, бла-бла

Выполнение имени функции ...

Каковы возможные обходные пути?

Ответы [ 2 ]

3 голосов
/ 08 января 2012

Вы можете использовать:

printf("%s\n", strerror(errno));

Убедитесь, что нет никаких входящих вызовов библиотеки (или сохраните errno, если они есть).

strerror находится в <string.h>.

2 голосов
/ 08 января 2012

Очистить выходной поток.stdout по умолчанию является буферизованной строкой;поэтому вывод эффективно записывается только тогда, когда он видит '\ n' (или когда буфер заполняется).В отличие от этого, stderr не буферизируется по умолчанию, поэтому каждый отдельный символ выводится немедленно.

printf("blah blah blah");
fflush(stdout);

Если вы завершите строку с помощью \ n, поток будет очищен без необходимостиконкретный оператор fflush.

printf("blah blah blah\n"); /* stream flushed */

Кроме того, вы можете распечатать свои информационные материалы в потоке stderr

fprintf(stderr, "Doing functioname...");

Преимущество заключается в том, что пользователи могут перенаправлять все информационные сообщения на/ DEV / нуль

...