2009-07-23 3 views
0

Ich teste gerade ein kleines Programm, das ich testen möchte.Anzeige von Standardfehlermeldungen

Ich frage mich, ob es eine Möglichkeit gibt, den stderr zu verwenden, um anzuzeigen, was der tatsächliche Fehler war.

Zum Beispiel, wenn die Datei nicht existiert. Gibt es einen Standardfehler, den ich anzeigen kann?

Ich benutze stderr, und ich dachte, mit dem ich könnte zeigen, was der eigentliche Fehler war.

Zum Beispiel. Wenn die Datei nicht beendet wird. Werden Fehler an stderr gesendet, die angezeigt werden können?

Ich hoffe, ich bin klar mit meiner Frage.

Vielen Dank für jede Beratung.

#include <stdio.h> 
#include <string.h> 

int main(void) 
{ 
    char buffer[100] = {'\0'}; /* declare and clean buffer */ 

    FILE *fp; 
    int len_of_buff = 0; 

    fp = fopen("licenseURL.txt", "r"); 

    if(fp == NULL) 
    { 
     fprintf(stderr, "There was a error opening a file ???"); 

     exit(1); 
    } 

    fgets(buffer, sizeof(buffer), fp); 
    len_of_buff = strlen(buffer); 
    buffer[len_of_buff + 1] = '\0'; /* null terminate */ 
    printf("The url is: [ %s ]\n", buffer); 

    fclose(fp); 
} 

Antwort

5

Ersetzen Sie Ihre fprintf (stderr, ...) rufen mit:

perror("file open"); 

(stderr ist nur ein Stream für das Senden von Fehlermeldungen an, so dass sie nicht mit der normalen Programmausgabe gemischt aufstehen - falls Sie auf eine Datei oder ähnliches umleiten.

3

Verwenden Sie die Funktion strerror(), um eine Zeichenfolge abzurufen, die den Fehler beschreibt.

1

Meine ungetestete Version würde wie folgt aussehen:


#include <errno.h> 
#include <stdarg.h> 
#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

static void 
die(const char *errstr, ...) { 
     va_list ap; 

     va_start(ap, errstr); 
     vfprintf(stderr, errstr, ap); 
     va_end(ap); 
     exit(EXIT_FAILURE); 
} 

int 
main(int argc, char **argv) { 
     static const char licenseURL[] = "licenseURL.txt"; 
     static char buf[100]; /* declare a clean buffer */ 
     FILE *fp; 
     size_t len = 0; 

     if(!(fp = fopen(licenseURL, "r"))) 
       die("couldn't %s: %s\n", licenseURL, strerror(errno)); 
     if(!fgets(buf, sizeof buf, fp)) 
       die("fgets failed: %s\n", strerror(errno)); 
     len = strlen(buf); 
     if(len > 1 && buf[len - 1] == '\n') 
       buf[len - 1] = '\0'; /* cut off trailing \n */ 
     printf("The url is: [ %s ]\n", buf); 
     fclose(fp); 

     return 0; 
}