2009-12-11 17 views
6

Nel mio programma C questa funzione gestirà tutto il lavoro di apertura di un file specifico e quindi restituirà il puntatore del file, in modo che le principali o altre funzioni possano leggere il contenuto usando fp, ma finora non sono stato in grado di farlo funzionare.Puntatore di ritorno dalla funzione C

Sto solo imparando la lingua, quindi è possibile che sto facendo qualcosa di molto sbagliato.

int open_text_file(char text_file_name[]) 
{ 
    FILE *fp; 

    if((fp = fopen(text_file_name, "r")) != 0) 
    { 
      return fp; 
    } 

    else 
    { 
      printf("Cannot open file \"%s\"\n", text_file_name); 
    } 
} 
+1

Si sta tentando di restituire un puntatore a una struttura 'FILE' come un' int'. Cosa (oltre a quell'errore) stai vedendo? –

+1

Come un problema di stile di codifica, dovresti confrontare 'fp' con' NULL' invece di '0'. Se potrebbe anche essere più chiaro separare il compito e il confronto di 'fp' in istruzioni separate. –

risposta

11

Nella prima riga, avete

int open_text_file(char text_file_name[]) 

Questo dichiara il tipo restituito come un int Che cosa si dovrebbe avere è

FILE * open_text_file(char text_file_name[]) 

Come pure, nel vostro "altro" caso, si dovrebbe restituire qualcosa per indicare un errore al chiamante.

return NULL 

è una scelta appropriata. Assicurati di controllare il valore di ritorno quando lo chiami, però.

+0

Perfetto, ora sono in grado di passare argv [1] alla funzione e stampare il contenuto da main. Come molti di voi dicono, dovrei confrontare fp con NULL, perché? – KJ0090

+0

Su alcune piattaforme non comuni, NULL potrebbe non essere 0. Questo non è vero in C++, o nella maggior parte dei casi nella pratica. – McPherrinM

0

FILE* open_text_file(); deve essere il prototipo.

Un int non è un FILE*.

6

La funzione è un po 'inutile, come tutto ciò che fa è ciò che fa fopen(), oltre al messaggio di errore. Questo non è un buon progetto, poiché il ramo di errore deve anche restituire un puntatore (presumibilmente NULL), che deve quindi essere nuovamente testato nel codice chiamante. Meglio sarebbe semplicemente dire:

FILE * fp = fopen(somefile, "r"); 
if (fp == NULL) { 
    fprintf(stderr, "Cannot open %s\n", somefile); 
    exit(1); // or whatever you need to do to handle the error 
} 
+0

+1, questa funzione è davvero inutile. –

Problemi correlati