He estado tratando de simple manejo de archivos en C y quería asegurarse de que el archivo puede ser accedido intentado usar este

#include<stdio.h>

main()
{
    CheckFile();
}

int CheckFile()
{
    int checkfile=0;

    FILE *fp1;
    fp1 = fopen("users.sav","r");

    if(fp1==NULL)
    {
        fopen("users.sav","w");
        fclose(fp1);
    }   
    if(checkfile!=0)printf("\nERROR ACCESSING FILE!\nNow exiting program with exit code: %d\n",checkfile);exit(1);
    return 0;
}

a continuación, se muestra

Segmentation fault (core dumped)

pero no violación de segmento si el archivo ya existe de antemano (por ejemplo, cuando he creado manualmente o cuando ejecuto el programa en el segundo tiempo)

Ayuda por favor. Necesito esto para nuestro proyecto final debido en una semana y no he conseguido el bloqueo de archivos y punteros todavía.

Estoy usando “gcc (Ubuntu/Linaro 4.8.1-10ubuntu9) 4.8.1”

P. s

Sé que existe aparentemente similares preguntas, pero por FAVOR, no downvote este. Entiendo que he comenzado a codificar para un par de meses y por lo tanto no pueden entender aquellos adelantado código y esas cosas.

p.p.s

Esto lo vi en otra pregunta

No hay ninguna garantía en su código original que fopen la que realmente está funcionando, en cuyo caso se devolverá NULL y el fclose no se define el comportamiento.

Entonces, ¿cómo es exactamente lo que puedo comprobar si funciona?

La verificación es correcta, simplemente no fclose(fp1) si fp1 == NULL pero llame a fp1 = fopen(..., "w");
Gracias 🙂 Las respuestas realmente me ayudó a salir de codificación ha ido bien hasta ahora.
Posibles duplicados de fclose() causa fallo de segmentación

OriginalEl autor user3437503 | 2014-03-19

5 Comentarios

  1. 6

    Eso es normal, cuando llame fclose(fp1) cuando fp1 es NULO.

    BTW

    fopen("users.sav","w");

    es inútil porque no asignar el valor de retorno a un puntero a un archivo. Que se refiere a los usuarios.sav archivo se abre para escritura, pero usted nunca será capaz de escribir nada en él .

    OriginalEl autor Jabberwocky

  2. 2

    No estoy muy seguro de lo que estás tratando de hacer, pero el problema inmediato es aquí:

    if(fp1==NULL)
       fclose(fp1);

    Después de afirmar que fp1 es NULL, se está tratando de llamar close en el puntero nulo, lo que provocará un fallo de segmentación.

    Si todo lo que quiero hacer es comprobar que el archivo existe, intente algo como ¿Cuál es la mejor manera de comprobar si existe un archivo en C? (multiplataforma)

    Gracias…. Una de las respuestas no ayudó mucho.

    OriginalEl autor mtripp100

  3. 2

    fopen devuelve un FILE puntero. Volverá NULL y establecer la errno para indicar el error. Si desea comprobar la errno, usted tiene que comprobar si después de comprobar si fopen devuelto NULL.

    if (fp1 == NULL)
    {
        printf("fopen failed, errno = %d\n", errno);
    }

    De lo contrario, usted puede obtener un errno de otra cosa, no necesariamente su fopen llamada. También incluyen errno.h. Usted también no necesita llamar a fopen("users.sav","w"); de nuevo. No reasignar el puntero ni la comprobación de nuevo.

    No veo una razón para llamar a fclose aquí, ya que si fopen devuelve NULL, no hay nada que cerrar. Que es probablemente la razón de su seg culpa. Usted está tratando de cerrar un puntero null. Más información sobre fopen fracasos.

    Otro comentario en tu código. Si va a devolver un int de CheckFile, probablemente no debería ser 0 en fallar. Me gustaría volver -1 para indicar un error. Mejor aún, podría regresar al mundial errno. También, main debe ser int main() y debe return 0; al final. Yo no le preocupa su esquema de nomenclatura de CheckFile. En C, check_file o camelCase de checkFile sería mejor.

    En CheckFile, su línea de if declaración podría ser formateado y trabajar más adecuadamente si formato en varias líneas. No es lo que piensa la actualidad:

    if(checkfile!=0)
    {
       printf("\nERROR ACCESSING FILE!\nNow exiting program with exit code: %d\n", checkfile);
       exit(1);
    }

    También, checkfile nunca es establecer en cualquier lugar en el código.. distinto de cero. Así, el código en el if instrucción no se ejecutará, período.

    OriginalEl autor Brian

  4. 0

    La página man de fclose dice –

    El comportamiento de fclose() no está definido si el flujo parámetro es un
    ilegal puntero, o es un descriptor, ya pasó a una anterior
    invocación de fclose().

    El error está en el if bloque en el código.

    if(fp1==NULL)
    {
        fopen("users.sav","w");
        fclose(fp1);  //passing NULL to fclose invokes undefined behaviour
    }   

    OriginalEl autor ajay

  5. 0

    Otro problema no relacionado:

    Esta línea no es probablemente lo que usted desea:

    if(checkfile!=0)printf("\nERROR ACCESSING FILE!\nNow exiting program with exit code: %d\n",checkfile);exit(1);

    Si escribimos correctamente formateado el error se hace evidente:

    if (checkfile != 0)
      printf("\nERROR ACCESSING FILE!\nNow exiting program with exit code: %d\n",checkfile);
    
    exit(1);
    return 0 ;

    Realmente vamos a llegar a exit(1) incluso si checkfile es cero.

    Probablemente te interese esto:

    if (checkfile != 0)
    {
      printf("\nERROR ACCESSING FILE!\nNow exiting program with exit code: %d\n",checkfile);
      exit(1); 
    }
    
    return 0 ;

    Conclusión: dar formato al código correctamente y muchos errores de repente parecen obvias.

    Probablemente, usted debe hacer rodar este en tu otra respuesta, buena captura 🙂
    Bueno, yo no estaba seguro de si debería haber hecho esto, porque este asunto es totalmente ajena a la pregunta original.
    Me gustaría.. hace que su respuesta sea más fuerte.
    Que definitivamente lo hizo… también señaló un montón de otras complicaciones en mi código que no me di cuenta (de ahí que no estaba incluido en mi pregunta) pero es probable que me persiguen como bien… supongo que este final del proyecto cosa es realmente poniendo de los nervios.

    OriginalEl autor Jabberwocky

Dejar respuesta

Please enter your comment!
Please enter your name here