¿Por qué ‘fopen’ devuelve un puntero NULL?

5 minutos de lectura

avatar de usuario
k787

Estoy trabajando en un programa simple de división/fusión de archivos en el lenguaje de programación C. El problema es que por alguna razón abierto devuelve NULL, y debido a eso, mi programa se bloquea en el escribir declaración. ¿Cómo puedo solucionar esto?

Aquí está el archivo C:

int SplitFile(char* filename, char* output, size_t size)
{
    char current_file_name[256];
    int file_count = 0, i = 0;
    FILE *file = fopen( filename, "rb" );
    printf("split %s into chunks of %d named\n", filename, size);

    if (!file)
       return E_BAD_SOURCE;
    else
    {
        output = (char *) malloc(size * sizeof(char));
        if (output == NULL)
            return E_NO_MEMORY;
        else
        {
            int bytes_read = 0;
            FILE *outFile;
            do
            {
                bytes_read = fread(output, sizeof(char), size, file );
                sprintf(current_file_name, "%s%04lu\n", "part", file_count++);
                outFile = fopen (current_file_name, "wb" );  // THIS RETURNS NULL
                fwrite(output, sizeof(char), bytes_read, outFile); //CRASHES ON THIS LINE
            }
            while ( bytes_read > 0 )
                ;

            //fclose(outFile);
        }
    }
    fclose(file);
    printf("...\n");
    return 0;
}

  • Snarky: compruebe el archivo abierto antes de intentar escribir en él. La respuesta real es que probablemente no tenga los permisos del sistema de archivos o que esté en una ruta de carpeta que no existe.

    – Enabren Tane

    13 de mayo de 2011 a las 5:37


  • ¿Qué error se almacena en errno? Solo agrega if (!outFile)perror("fopen"); y deja que la biblioteca te diga por qué falló. 🙂

    – Sarnold

    13 de mayo de 2011 a las 5:40


  • en errno me estoy poniendo fopen: Argumento no válido

    – k787

    13 de mayo de 2011 a las 5:43

  • ¿Estás dando el camino correcto?

    – Shweta

    13 de mayo de 2011 a las 5:44

  • debe usar la ruta predeterminada (la carpeta que contiene .c y .h). No creo que esté relacionado con la ruta.

    – k787

    13 de mayo de 2011 a las 5:48

avatar de usuario
Gabe

Lo correcto es verificar errno Cuándo fopen devoluciones NULL.

Supongo que su problema es que está tratando de escribir en un sistema de archivos que no permite \n en los nombres de archivo, pero también podría ser un problema de permisos.

  • Lo más correcto es verificar errno cuando fopen devuelve NULL. Probablemente quisiste decir fopen en lugar de fwrite.

    – Programador de Windows

    13 de mayo de 2011 a las 5:44

  • cuando comento el sprintf y hago esto; outFile = fopen (“part000”, “wb”); funciona bien.

    – k787

    13 de mayo de 2011 a las 5:50


  • @usuario: ¿Has tomado el \n fuera de tu sprintf línea, entonces?

    – Gabo

    13 de mayo de 2011 a las 6:00

  • @usuario: El \n el carácter no está permitido en un nombre de archivo. Que causa fopen falla, por lo que devuelve NULL.

    – Gabo

    13 de mayo de 2011 a las 6:23

  • ayudaría ver un ejemplo de verificación errno. por eso estamos aquí, para aprender 🙂

    – jenkizenki

    13 de marzo de 2020 a las 21:53


avatar de usuario
jaredpar

Hay muchas razones fopen puede volver NULL incluyendo (pero ciertamente no limitado a):

  • el archivo no existe
  • El archivo se abre en un modo que no permite otros accesos
  • La red está caída
  • El archivo existe, pero no tienes permisos
  • Existe un archivo con el nombre que proporcionó, pero el directorio actual del proceso no es el que esperaba, por lo que la ruta de acceso relativa no puede encontrar ni abrir el archivo.

La forma de saber quién es el responsable es indagar en el errno código.

Sin embargo, el hecho de que resuelva este error en particular no significa que pueda asumir fopen nunca volveré NULL. Cuando se trata de operaciones de E/S, su código simplemente debe esperar fallas. No es posible predecir el éxito de las operaciones de E/S y siempre pueden fallar.

  • ¿Qué hay de quedarse sin espacio? ¿Eso no haría que devuelva NULL? (Sé que dijiste “no limitado a” mi pregunta no es retórica)

    – Nande

    19 de febrero de 2016 a las 2:02


  • @Nande: fopen() que crea un nuevo archivo puede o no tener éxito en un disco lleno. Si el directorio no necesita expandirse (y no se ha quedado sin inodos), puede tener éxito, pero lo siguiente fwrite() (o fclose()!) fallará.

    – Davis arenque

    23/09/2017 a las 23:45

avatar de usuario
Sohail xIN3N

Significa que es posible que el archivo no exista o que se haya producido algún error de permiso al acceder a un archivo como “Solo lectura” o “Protegido contra escritura”, por lo que en esos casos fopen devolverá 0 (un puntero NULL). En caso de éxito, devolverá un puntero de archivo como controlador.

fp=fopen("c:\\ABC.txt", "r"); no puede ser lo mismo que fp=fopen("c:\\abc.txt", "r");.

Utilizar // en lugar de \\ en un entorno Linux.

PD: En los sistemas operativos Linux y similares a Unix, los nombres de archivo son distingue mayúsculas y minúsculas.

¿Está fopen para el retorno de escritura NULL en la primera ejecución?

Noté que en el momento mantienes archivos abiertos para escribir pero no los cierras.

Intente agregar fclose(outFile) después de fwrite:

outFile =  fopen ( current_file_name , "wb" );    
fwrite(output, sizeof( char ), bytes_read, outFile); 
fclose(outFile)

Es posible que abra más archivos de los que permite su sistema operativo.

avatar de usuario
Vinoj John Hosan

En Unix, para fopen(), no hay motivo para anteponer ./ a un nombre de archivo pasado a fopen().

avatar de usuario
Riki137

En mi caso, estaba leyendo el mismo archivo de nuevo en un ciclo while y olvidé cerrarlo.

Usé una función para leer el archivo y encontrar una coincidencia y la función tenía un return; declaración que terminó la función antes de hacer fclose(fp) 😀

avatar de usuario
sanya tayal

La ruta dada para el archivo se verifica desde donde esté presente el ejecutable. En mi caso, estaba abriendo el archivo de texto en el archivo c cuando ambos estaban presentes en el mismo lugar. Daba continuamente el error de archivo no encontrado. Coloqué el archivo en la carpeta del ejecutable y comenzó a funcionar.

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad