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

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;
}
Sarcástico – compruebe el archivo que se abre antes de intentar escribir. La verdadera respuesta es probablemente no tiene los permisos del sistema de archivos o en una ruta de la carpeta que no existe
¿Qué error se almacena en errno? Sólo añadir if (!outFile)perror("fopen"); y vamos a la biblioteca diga por qué ha fallado. 🙂
en errno estoy recibiendo fopen : Argumento no Válido
Están dando el camino correcto?
se debe utilizar la ruta de acceso predeterminada( la carpeta que contiene el .c y .h ). Yo no creo que es relativa a la ruta de acceso

OriginalEl autor k787 | 2011-05-13

8 Comentarios

  1. 11

    Lo más apropiado es consultar errno cuando fopen devuelve NULL.

    Me imagino que tu problema es que estás tratando de escribir a un archivo de sistema que no permite \n en los nombres de archivo, pero podría ser un problema de permisos así.

    El más adecuado cosa a hacer es comprobar errno cuando fopen devuelve NULL. Usted probablemente significaba fopen lugar de fwrite.
    cuando yo comente la sprintf y hacer esto; outFile = fopen ( «part000» , «wb» ); funciona bien.
    Oops! Gracias.
    Si has tomado la \n de su sprintf línea, entonces?
    El \n de caracteres no permitidos en un nombre de archivo. Que hace que fopen a fallar, por lo que se devuelve NULL.

    OriginalEl autor Gabe

  2. 5

    Hay muchas razones fopen puede volver NULL incluyendo (pero no se limita a):

    • No existe el archivo
    • El archivo se abre en un modo que no permite otros accesos
    • La red se cae
    • El archivo existe, pero usted no tiene permisos de
    • Existe un archivo con el nombre que le dio, pero el directorio actual del proceso no es lo que esperaba por lo que el nombre de ruta relativa no puede encontrar y abrir el archivo.

    La forma de averiguar cual es la responsable es cavar en la errno código.

    Sin embargo, sólo porque usted resolver este error en particular no significa que usted puede asumir fopen nunca volverá NULL. Cuando se trata con operaciones de e/S el código, simplemente tiene que esperar el fracaso. No es posible predecir el éxito de las operaciones de e/S, y que siempre se puede fallar.

    ¿qué acerca de la ejecución de espacio? no se que hacer es devolver NULL? (yo sé que usted dijo «no se limita a» mi pregunta no es retórica)
    fopen() que crea un nuevo archivo puede o no puede tener éxito en un disco completo. Si el directorio no necesita de la expansión (y no estamos fuera de inodes), se puede tener éxito, pero un siguiente fwrite() (o fclose()!) va a fracasar.

    OriginalEl autor JaredPar

  3. 1

    Como Gabe dijo que su problema es la nueva línea en el nombre de archivo, lo cual es ilegal en Windows.

    Pero por qué no simplemente usar split de GNU Core Utilities. Instalado por defecto en los sistemas unix/Linux, se puede descargar para Windows desde GnuWin32 proyecto.

    split --suffix-length=4 --numeric-suffixes --bytes=1M - part < filename

    OriginalEl autor Tometzky

  4. 1

    Significa que el archivo no existe o algún permiso error al obtener acceso a un archivo, como «Sólo Lectura» o «Protegido contra Escritura», por lo que en esos casos fopen devolverá 0 (un puntero NULO). En caso de éxito devolverá un puntero a un archivo como un controlador.

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

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

    P. S.: En Linux y Unix-como sistemas operativos de los nombres de archivo se entre mayúsculas y minúsculas.

    OriginalEl autor Sohail xIN3N

  5. 0

    Es fopen para escribir devolver NULL en la primera carrera?

    Me di cuenta de que en el tiempo que mantener la apertura de los archivos para escribir, pero no cerrarlas.

    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 abrir más archivos de su sistema operativo permite.

    sí, yo pensé lo mismo y cerró los archivos, pero no funcionó

    OriginalEl autor Amir

  6. 0

    En Unix, por fopen(), no hay ninguna razón para anteponer ./a un nombre de archivo pasa a fopen().

    OriginalEl autor Vinoj John Hosan

  7. 0

    En mi caso, yo estaba leyendo el mismo archivo de nuevo en un bucle while y se olvidó de cerrar.

    He utilizado una función para leer el archivo y la búsqueda de un partido y la función de un return; declaración de que termina la función antes de hacer fclose(fp) 😀

    OriginalEl autor Riki137

  8. 0

    La ruta dada por el archivo está protegido siempre que el ejecutable está presente.
    En mi caso me fue abriendo el archivo de texto en el archivo c cuando ambos estuvieron presentes en el mismo lugar.
    Era continuamente dando el error de archivo no encontrado.
    Coloca el archivo en la carpeta del ejecutable y se comenzó a trabajar.

    OriginalEl autor Sanya Tayal

Dejar respuesta

Please enter your comment!
Please enter your name here