如何使用“printf”打印到 C 中的标准错误?

问题描述 投票:0回答:8

在 C 中,使用 printf 中的

stdio.h
打印到
标准输出
(stdout)很容易。

但是,如何打印到标准错误(stderr)?显然我们可以使用

fprintf
来实现它,但它的语法似乎很奇怪。也许我们可以使用
printf
打印到标准错误?

c printf stderr
8个回答
324
投票

语法与

printf
几乎相同。使用
printf
可以给出字符串格式及其内容,即:

printf("my %s has %d chars\n", "string format", 30);

fprintf
是一样的,只不过现在您还指定了打印位置:

FILE *myFile;
...
fprintf(myFile, "my %s has %d chars\n", "string format", 30);

或者您的情况:

fprintf(stderr, "my %s has %d chars\n", "string format", 30);

65
投票

格式化输出到 stdout 和 stderr 的一些示例:

printf("%s", "Hello world\n");              // "Hello world" on stdout (using printf)
fprintf(stdout, "%s", "Hello world\n");     // "Hello world" on stdout (using fprintf)
fprintf(stderr, "%s", "Stack overflow!\n"); // Error message on stderr (using fprintf)

26
投票
#include<stdio.h>

int main ( ) {
    printf( "hello " );
    fprintf( stderr, "HELP!" );
    printf( " world\n" );
    return 0;
}

$ ./a.exe
HELP!hello  world
$ ./a.exe 2> tmp1
hello  world
$ ./a.exe 1> tmp1
HELP!$
  1. stderr 通常是无缓冲的,而 stdout 通常是无缓冲的。这可能会导致类似这样的奇怪输出,这表明代码正在以错误的顺序执行。事实并非如此,只是标准输出缓冲区尚未刷新。 重定向或管道流当然不会看到这种交错,因为它们通常只能看到 stdout 或 stderr 的输出。

  2. 虽然最初 stdout 和 stderr 都来到控制台,但两者都是独立的并且可以单独重定向。


12
投票

如果您不想修改当前代码而只是为了调试使用。

添加此宏:

#define printf(args...) fprintf(stderr, ##args)
// Under GCC

#define printf(args...) fprintf(stderr, __VA_ARGS__)
// Under MSVC

如果要回滚,请将

stderr
更改为
stdout

这对调试很有帮助,但这不是一个好的做法。


3
投票

你可能知道

sprintf
。基本上和
fprintf
是一样的。第一个参数是目的地(
fprintf
情况下的文件,即
stderr
),第二个参数是格式字符串,其余参数照常。

我还推荐这个

printf
(和家人)参考


0
投票

我不知道您想要使用 fprintf 的场景是什么。如果要处理错误,建议在 C 中打印错误的方法是使用 perror 函数。

此函数会将您的错误打印到 stderr 以及从上一个函数返回的解释后的 errno。该错误是线程本地的,即每个线程都有其私有值。例如,如果您尝试写入受保护目录内的文件,如以下函数所示:

int main() {
    FILE *file = fopen("/some_write_protected_dir/file.txt", "w");
    if (file == NULL) {
        perror("Error creating file");
    } else {
        fclose(file);
    }
    return 0;
}

它将打印

Error creating file: Permission denied
。请注意,它添加了 errno 13 的解释文本。此外,请确保不要调用其他系统调用,因为 errno 值将被覆盖。

另一方面,fprintf(stderr, ...) 函数可用于打印自定义错误消息。


-1
投票

出于某种原因,还没有人提到

eprintf()
,这与
fprintf(stderr, ...)
是同一件事。

eprintf("ERROR: You have caused an error!!1!");

快速提示:如果您使用 stderr 进行调试,则可以使用

__LINE__

#define printfError(str, ...) eprintf("ERROR at line " #__LINE__ ": " str, __VA_ARGS__)

printfError("Division by zero"); // "ERROR at line 2: Division by zero

-8
投票

要打印上下文,您可以编写如下代码:

FILE *fp;
char *of;
sprintf(of, "%s%s", text1, text2);
fp = fopen(of, 'w');
fprintf(fp, "your print line");
© www.soinside.com 2019 - 2024. All rights reserved.