web-dev-qa-db-ja.com

Cで標準エラー出力に印刷するにはどうすればいいですか?

Cでは、stdio.hprintfを使用すると、標準出力への印刷は簡単です。

しかし、どのようにして標準エラーに出力できますか?明らかにそれを達成するためにfprintfを使うことができますが、その構文は奇妙に思えます。たぶん私たちは標準エラー出力にprintfを使うことができますか?

78
wad

構文は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);
125

例:

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)
24
Paul R
#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の両方がコンソールに表示されますが、どちらも別々であり、個別にリダイレクトできます。

5
hasectic saif

sprintfを知っていますか?基本的にfprintfと同じです。最初の引数は宛先(fprintfの場合はファイル、つまりstderr)、2番目の引数はフォーマット文字列、残りは通常通りの引数です。

このprintf(そしてファミリー)のリファレンス もお勧めします。

現在のコードを変更したくない場合や、デバッグのためだけに使用する場合。

このマクロを追加してください。

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

ロールバックする場合はstderrstdoutに変更してください。

デバッグには役立ちますが、あまり良い方法ではありません。

4
lxiange