C'de stderr'e nasıl yazdırabilirim?


120

C yılında Stdout'a yazdırma ile, kolay printfgelen stdio.h.

Ancak, stderr'e nasıl yazdırabilirim? fprintfGörünüşe göre bunu başarmak için kullanabiliriz , ancak sözdizimi garip görünüyor. Belki printfstderr'e yazdırmak için kullanabiliriz ?


5
Sözdizimi hakkında bu kadar "tuhaf" olan nedir? Nerede , nasıl ve ne yazdırılır .
Eugene Sh.

5
Ona odaklanıyorum. Sorudan kaynaklanan tek sorun, çözümü "tuhaf" bulmanız. Aksi takdirde soru kalmaz. Kullanın fprintf.
Eugene Sh.

@Eugene. Size katılıyorum. Stderr'in bir DOSYA olduğunu fark etmediğim için garip olduğunu düşündüm :)
wad

Yanıtlar:


179

Sözdizimi neredeyse aynıdır printf. Sizinle printfdize biçimini ve içeriğini verirsiniz, yani:

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

Bununla fprintfaynıdır, ancak artık yazdırılacak yeri de belirtiyorsunuz:

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

Veya sizin durumunuzda:

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

34

Örnekler:

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 genellikle arabelleğe alınmaz ve standart çıkış genellikle öyledir. Bu, bunun gibi garip görünen çıktılara yol açabilir, bu da kodun yanlış sırada yürütüldüğünü gösterir. Sorun değil, sadece stdout tamponu henüz temizlenmedi. Yeniden yönlendirilmiş veya borulu akışlar, doğal olarak yalnızca stdout veya yalnızca stderr çıktısını görecekleri için bu serpiştirmeyi görmezler.

  2. Başlangıçta hem stdout hem de stderr konsola gelseler de, her ikisi de ayrıdır ve ayrı ayrı yönlendirilebilir.



5

Mevcut kodları değiştirmek istemiyorsanız ve sadece hata ayıklama kullanımı için.

Bu makroyu ekleyin:

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

Değişim stderriçin stdoutsize rulo arkasına istiyorum.

Hata ayıklamaya yardımcı olur, ancak iyi bir uygulama değildir.


0

Bağlamınızı yazdırmak için şu şekilde kod yazabilirsiniz:

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

Bu, önceki cevaplara hiçbir şey eklemez ve soruyu gerçekten cevaplamaz.
Fantastik Bay Fox

Bu sprintf () ifadesi bellek bozulmasına neden olur! ... İşaretçilerin, dizilerin ve dizelerin nasıl çalıştığını okumanızı şiddetle tavsiye ederim.
BlueChip
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.