2011-07-13 17 views
12

El código que tengo es el siguiente:fopen() que devuelve un puntero NULL, pero sin duda existe el archivo

FILE *txt_file = fopen("data.txt", "r"); 
if (txt_file == NULL) { 
    perror("Can't open file"); 
} 

El mensaje de error devuelto es:

No se puede abrir el archivo: No tal archivo o directorio

el archivo 'datos.txt' sin duda existe en el directorio de trabajo (como existe en el directorio que contiene mi .c y .h), ¿por qué se fopen() devuelve un NULL ¿puntero?

+4

¿Está ejecutando desde la línea de comandos o desde un IDE? Si IDE, ¿está seguro de que el directorio de trabajo del programa está configurado en el directorio que contiene el archivo de datos? – fvu

+0

¿se puede agregar el resultado de 'ls -Fal' para el directorio en cuestión? –

+1

es posible que no tenga permiso para abrirlo. ¿Estás en linux? –

Respuesta

7

¿Es posible que el nombre del archivo no sea realmente "data.txt"?

En Unix, los nombres de archivo son realmente cadenas de bytes, no cadenas de caracteres, y es posible crear archivos con controles, como el retroceso en sus nombres. He visto casos en el pasado en los que copiar y pegar en terminales daba como resultado archivos con nombres de apariencia común, pero tratar de abrir el nombre de archivo que aparece en una lista de directorios genera un error.

Una forma de saber con certeza que los nombres de archivo son en realidad lo que usted piensa que son:

$ python 
>>> import os 
>>> os.listdir('.') 
+4

¿Quiere decir que el nombre del archivo podría ser "data.txt" con la extensión de archivo '.txt'? ¿Quiere decir que el nombre completo de los archivos podría ser 'data.txt.txt'? – Barjavel

+3

Esto resultó ser el caso. – Barjavel

2

Asegúrese de que el archivo de entrada está en el mismo directorio que el ejecutable, que puede ser diferente a la que donde se guardan tus archivos fuente Si está ejecutando el programa en un depurador IDE, asegúrese de que su directorio de trabajo esté configurado en la ubicación del archivo de entrada. Además, si está ejecutando * nix en lugar de Windows, es posible que deba anteponer un "./" al nombre de archivo de entrada.

+2

No hay ninguna razón para anteponer '. /' A un nombre de archivo pasado a 'fopen()' en UNIX. – caf

9

Problema de estándar. Pruebe

FILE *txt_file = fopen("C:\\SomeFolder\\data.txt", "r"); 

I.e. intente abrirlo con el camino absoluto completo primero; si funciona, entonces solo tiene que averiguar cuál es el directorio actual con _getcwd() y luego corregir su ruta relativa.

2

¿Carácter ESPACIO invisible en el nombre del archivo?

Una vez al año tengo un problema similar: Intento abrir un archivo con el nombre de archivo en una cadena, obtenida de una operación de sting. Cuando imprimo el nombre parece correcto, pero fopen() devuelve un puntero nulo. La única ayuda es imprimir el nombre con delimitadores que muestren el comienzo y el final exactos de la cadena de nombre de archivo. Por supuesto, esto no ayuda con los caracteres no imprimibles.

0

Acabo de tener un problema similar al que sabía que la ruta era correcta y el archivo estaba en el lugar correcto. Verifica los permisos del archivo. Es posible que el programa no pueda acceder al archivo porque está obteniendo permiso denegado.

2

Mi problema era que tenía un archivo filename.txt y no me di cuenta de que en realidad era filename.txt.txt debido a que Windows no mostraba la extensión.

Cuestiones relacionadas