Cでstderrに出力するにはどうすればよいですか?


119

Cでは、printffromを使用して、標準出力への印刷は簡単stdio.hです。

しかし、どのようにstderrに出力できますか?fprintf明らかにそれを達成するために使用できますが、その構文は奇妙に見えます。多分私達はprintfstderrへの印刷に使用できますか?


5
その構文の「奇妙な」とは何ですか?どこにどのように何を印刷します。
Eugene Sh。

5
私はそれに集中しています。質問から生じる唯一の問題は、「奇妙な」解決策を見つけることです。そうでなければ問題はありません。を使用しfprintfます。
Eugene Sh。

@Eugene。仰るとおりです。stderrがFILEであることに気づかなかったので、私は奇妙だと思いました:)
wad

回答:


179

構文はとほぼ同じprintfです。でprintf使用する文字列の形式を与え、その内容は、IE:

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);

33

例:

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)

9
#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バッファがまだフラッシュされていないということだけです。リダイレクトまたはパイプされたストリームは、通常はstdoutのみまたはstderrのみの出力しか表示しないため、もちろんこのインターリーブは表示されません。

  2. 最初はstdoutとstderrの両方がコンソールに表示されますが、どちらも個別であり、個別にリダイレクトできます。



5

現在のコードを変更したくなく、デバッグ目的でのみ使用する場合。

このマクロを追加します。

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

ロールバックstderrするstdout場合はに変更します。

デバッグには役立ちますが、お勧めできません。


0

あなたのコンテキストを印刷するには、次のようなコードを書くことができます:

FILE *fp;
char *of;
sprintf(of,"%s%s",text1,text2);
fp=fopen(of,'w');
fprintf(fp,"your print line");

これは以前の答えに何も追加せず、質問に実際に答えることもありません。
ファンタスティックMr Fox

そのsprintf()ステートメントはメモリ破損を引き起こします!...ポインタ、配列、および文字列がどのように機能するかを読むことを強くお勧めします。
BlueChip
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.