2009-12-11 32 views
6

En mi programa C, esta función manejará todo el trabajo de abrir un archivo específico y luego devolverá el puntero del archivo, para que las funciones principales u otras puedan leer el contenido usando fp, pero hasta ahora no han podido hacer que esto funcione.Puntero de retorno de la función C

Estoy aprendiendo el idioma, por lo que es posible que esté haciendo algo muy malo.

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

Está intentando devolver un puntero a una estructura 'FILE' como' int'. ¿Qué (además de ese error) estás viendo? –

+1

Como problema de estilo de codificación, debe comparar 'fp' contra' NULL' en lugar de '0'. También podría ser más claro separar la asignación y la comparación de 'fp' en declaraciones separadas. –

Respuesta

11

En la primera línea, usted tiene

int open_text_file(char text_file_name[]) 

Esto declara el tipo de retorno como un int Lo que debe tener es

FILE * open_text_file(char text_file_name[]) 

A su vez, en su "otra cosa" caso, debe devolver algo para indicar un error a la persona que llama.

return NULL 

es una opción adecuada. Sin embargo, asegúrese de verificar el valor de retorno cuando lo llame.

+0

Perfecto, ahora puedo pasar argv [1] a la función e imprimir el contenido desde main. Como muchos de ustedes dicen, debería comparar fp con NULL, ¿por qué? – KJ0090

+0

En algunas plataformas poco comunes, NULL puede no ser 0. Esto no es cierto en C++ sin embargo, o la mayoría de los lugares en la práctica. – McPherrinM

0

FILE* open_text_file(); debe ser el prototipo.

Un int no es un FILE*.

6

La función es un poco inútil, ya que todo lo que hace es lo que fopen() hace, más el mensaje de error. Este no es un buen diseño, ya que la rama de error también debe devolver un puntero (presumiblemente NULL), que luego debe probarse nuevamente en el código de llamada. Mejor sería simplemente decir:

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, esta función es realmente inútil. –

Cuestiones relacionadas