El código que tengo es el siguiente:

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 existe el fichero o directorio

El archivo ‘data.txt’ sin duda existe en el directorio de trabajo (que existe en el directorio que contiene mi .c y .h archivos), así que ¿por qué es fopen() devuelve un puntero NULO?

estás ejecutando desde la línea de comandos o desde un IDE? Si es IDE, żestás seguro de que el directorio de trabajo del programa se establece en el directorio que contiene el archivo de datos?
puedes añadir la salida de ls -Fal para el directorio en cuestión?
usted tal vez no tenga permiso para abrirlo. estás en linux?
Puede adjuntar el código en su totalidad?
Usted puede obtener el directorio de trabajo actual con la _getcwd() función, el uso que de la depuración y de aprendizaje en el directorio de trabajo de Visual Studio se ejecuta el programa.

OriginalEl autor Barjavel | 2011-07-13

7 Comentarios

  1. 8

    Es posible que el nombre no es realmente «data.txt»?

    En Unix, los nombres de archivos son realmente cadenas de bytes no cadenas de caracteres, y es posible crear archivos con los controles, tales como la tecla de retroceso en sus nombres. He visto casos en el pasado en el que el copiar-pegar en los terminales resultado en archivos con apariencia ordinaria nombres, pero al intentar abrir el archivo que aparece en el listado de un directorio de los resultados en un error.

    Una forma de asegurarse de que los nombres de los archivos son realmente lo que usted piensa que son:

    $ python
    >>> import os
    >>> os.listdir('.')
    Quiere decir que el nombre de archivo puede ser «data.txt» con la extensión de archivo ‘.txt’? Significado de los archivos nombre completo podría ser ‘data.txt.txt’?
    Este resultó ser el caso.

    OriginalEl autor wberry

  2. 12

    Problema estándar. Trate de

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

    I. e. trate de abrirlo con la plena ruta de acceso absoluta en primer lugar ; si funciona, a continuación, usted sólo tiene que averiguar lo que el directorio actual es con _getcwd() y, a continuación, fijar la ruta de acceso relativa.

    OriginalEl autor Jacob

  3. 3

    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 muestra la extensión.

    OriginalEl autor Janne

  4. 2

    Asegúrese de que el archivo de entrada está en el mismo directorio que el ejecutable, que puede ser diferente de aquel en el que los archivos de origen se mantienen. Si está ejecutando el programa en un IDE depurador, asegúrese de que el directorio de trabajo se establece en la ubicación del archivo de entrada. También, si usted está funcionando en *nix en lugar de Windows, puede que tenga que anteponer un «./» a la entrada de nombre de archivo.

    No hay ninguna razón para anteponer ./ a un nombre de archivo pasa a fopen() en UNIX.

    OriginalEl autor Kevin D.

  5. 2

    Invisible carácter de ESPACIO de nombre de archivo?

    Una vez al año tengo un problema similar:
    Intento abrir un archivo con el nombre de archivo en una cadena, obtenido a partir de una operación encubierta. Al imprimir el nombre parece bien, pero fopen() devuelve un puntero nulo. La única ayuda es la impresión de los nombres con los delimitadores que muestra el momento exacto de inicio y final de la cadena de nombre de archivo. Por supuesto, esto no ayuda con caracteres no imprimibles.

    OriginalEl autor karsten

  6. 0

    Yo solo tuve un problema similar como este, donde sabía que el camino era el correcto y el archivo en la ubicación correcta. Compruebe los permisos del archivo. Es posible que el programa no tiene acceso al archivo porque está consiguiendo permiso denegado.

    OriginalEl autor Nautilus

  7. 0

    Me encontré con el mismo valor a errno fopen en Linux desde un archivo de secuencia de comandos dañado por Windows.

    ENOENT 2 No tal archivo o directorio

    Wordpad en Windows (o algún otro de Microsoft culpable) que se inserta CRLF = (0x0D, 0x0A) en mi linux archivos de secuencia de comandos en lugar de newline = LF = 0x0A. Cuando leí el nombre de archivo en un búfer y la llamada a fopen si ha fallado debido a la invisible anexa carácter CR.

    En el Codelite editor de Linux Mint yo era capaz de mostrar EOL caracteres (View > Pantalla EOL) y eliminarlos con buscar y reemplazar, copiar y pegar de la CRLF dañado archivos de secuencia de comandos y la LF de la incorruptos de archivo en los campos de texto.

    OriginalEl autor Tron

Dejar respuesta

Please enter your comment!
Please enter your name here