Hoe kan ik afdrukken naar stderr in C?

In C is afdrukken naar stdout eenvoudig, met printfvan stdio.h.

Hoe kan ik echter afdrukken naar stderr? We kunnen fprintfgebruiken om het blijkbaar te bereiken, maar de syntaxis lijkt vreemd. Misschien kunnen we printfgebruiken om naar stderr af te drukken?


Antwoord 1, autoriteit 100%

De syntaxis is bijna hetzelfde als printf. Met printfgeef je het tekenreeksformaat en de inhoud ervan, dwz:

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

Met fprintfis het hetzelfde, behalve dat je nu ook de plaats opgeeft om naar af te drukken:

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

Of in jouw geval:

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

Antwoord 2, autoriteit 21%

Enkele voorbeelden van geformatteerde uitvoer naar stdout en 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)

Antwoord 3, autoriteit 5%

#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 is meestal niet gebufferd en stdout is dat meestal wel. Dit kan leiden tot vreemd uitziende uitvoer zoals deze, wat suggereert dat code in de verkeerde volgorde wordt uitgevoerd. Dat is het niet, het is alleen dat de stdout-buffer nog moet worden leeggemaakt.
    Omgeleide of doorgesluisde streams zouden deze interleave natuurlijk niet zien, omdat ze normaal alleen de uitvoer van alleen stdout of alleen stderr zouden zien.

  2. Hoewel aanvankelijk zowel stdout als stderr naar de console komen, zijn beide gescheiden en kunnen ze afzonderlijk worden omgeleid.


Antwoord 4, autoriteit 2%

Ken jij sprintf? Het is in principe hetzelfde met fprintf. Het eerste argument is de bestemming (het bestand in het geval van fprintfdwz stderr), het tweede argument is de opmaakstring en de rest zijn de argumenten zoals gewoonlijk.

Ik raad ook deze printf(en familie) referentie.


Antwoord 5, autoriteit 2%

Als je de huidige codes niet wilt wijzigen en alleen voor foutopsporing.

Voeg deze macro toe:

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

Verander stderrin stdoutals je wilt terugdraaien.

Het is handig voor het opsporen van fouten, maar het is geen goede gewoonte.


Antwoord 6

Om je context af te drukken, kun je de code als volgt schrijven:

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

Other episodes