Cでは、stdio.h
のprintf
を使用すると、標準出力への印刷は簡単です。
しかし、どのようにして標準エラーに出力できますか?明らかにそれを達成するためにfprintf
を使うことができますが、その構文は奇妙に思えます。たぶん私たちは標準エラー出力にprintf
を使うことができますか?
構文は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);
例:
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)
#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!$
通常stderrはバッファされておらず、stdoutは通常です。これは、このように奇妙に見える出力につながる可能性があります。これは、コードが間違った順序で実行されていることを示しています。そうではありません、それはそれだけで標準出力バッファがフラッシュされていないということです。リダイレクトまたはパイプされたストリームは、通常、stdoutのみまたはstderrのみの出力を見るため、このインターリーブを見ません。
最初はstdoutとstderrの両方がコンソールに表示されますが、どちらも別々であり、個別にリダイレクトできます。
sprintf
を知っていますか?基本的にfprintf
と同じです。最初の引数は宛先(fprintf
の場合はファイル、つまりstderr
)、2番目の引数はフォーマット文字列、残りは通常通りの引数です。
このprintf
(そしてファミリー)のリファレンス もお勧めします。
現在のコードを変更したくない場合や、デバッグのためだけに使用する場合。
このマクロを追加してください。
#define printf(args...) fprintf(stderr, ##args)
//under GCC
#define printf(args...) fprintf(stderr, __VA_ARGS__)
//under MSVC
ロールバックする場合はstderr
をstdout
に変更してください。
デバッグには役立ちますが、あまり良い方法ではありません。