Quiero que mi programa para abrir un archivo si no existe, o bien crear el archivo. Estoy tratando el siguiente código pero me estoy haciendo una aserción de depuración en freopen.c. Sería mejor usar fclose y, a continuación, fopen inmediatamente después?

FILE *fptr;
    fptr = fopen("scores.dat", "rb+");
    if(fptr == NULL) //if file does not exist, create it
    {
        freopen("scores.dat", "wb", fptr);
    } 
  • Estoy tan preocupado de que la gente no upvoting la respuesta que explica el fallo. Gracias a Dios es viernes 🙂
InformationsquelleAutor karoma | 2012-03-23

2 Comentarios

  1. 52

    Normalmente tienes que hacer esto en una sola syscall, o de lo contrario obtendrá una condición de carrera.

    Este se abre para lectura y escritura, crear el archivo si es necesario.

    FILE *fp = fopen("scores.dat", "ab+");

    Si quieres leer y escribir una nueva versión desde cero, y luego, como dos pasos.

    FILE *fp = fopen("scores.dat", "rb");
    if (fp) {
        read_scores(fp);
    }
    
    //Later...
    
    //truncates the file
    FILE *fp = fopen("scores.dat", "wb");
    if (!fp)
        error();
    write_scores(fp);
    • Parece que el OP está tratando de abrir en modo de sólo lectura si ya existe (no entiendo por qué quieren crear en ese caso, aunque).
    • Bien, si él no quiere escribir, que no necesita. Que yo sepa, no hay manera de abrir como de sólo lectura en la condición en la que existe sin la creación de una huelga condición de carrera.
    • Pensé que la rb+ me deja escribir también? Después de esta sección de código tengo que leer de todo, desde el archivo, a continuación, después de escribir el archivo desde cero.
    • Ah, entendí mal tu pregunta. Esta es la respuesta correcta, +1.
  2. 9

    Si fptr es NULL, entonces usted no tiene un archivo abierto. Por lo tanto, usted no puede freopen, usted sólo debe fopen ella.

    FILE *fptr;
    fptr = fopen("scores.dat", "rb+");
    if(fptr == NULL) //if file does not exist, create it
    {
        fptr = fopen("scores.dat", "wb");
    }

    nota: Desde el comportamiento de su programa varía dependiendo de si el archivo se abre en leer o escribir modos, lo más probable también es necesario mantener una variable que indica cual es el caso.

    Un ejemplo completo

    int main()
    {
        FILE *fptr;
        char there_was_error = 0;
        char opened_in_read  = 1;
        fptr = fopen("scores.dat", "rb+");
        if(fptr == NULL) //if file does not exist, create it
        {
            opened_in_read = 0;
            fptr = fopen("scores.dat", "wb");
            if (fptr == NULL)
                there_was_error = 1;
        }
        if (there_was_error)
        {
            printf("Disc full or no permission\n");
            return EXIT_FAILURE;
        }
        if (opened_in_read)
            printf("The file is opened in read mode."
                   " Let's read some cached data\n");
        else
            printf("The file is opened in write mode."
                   " Let's do some processing and cache the results\n");
        return EXIT_SUCCESS;
    }
    • Esto tiene una condición de carrera, se producirá un error si otro proceso crea el archivo entre las dos llamadas a fopen.
    • No había a pesar de que!
    • Si el punto inicial «Si fptr es NULL, entonces usted no tiene un archivo abierto. Por lo tanto, usted no puede reopen ella.», explica el comportamiento de la OP está viendo (que creo que lo hace), entonces, para mayor claridad, puede ser que valga la edición del texto a parte de que el punto de enfoque posterior a la fijación. (también reabrir debe ser freopen)
    • gracias, me gustaría que
    • eres bienvenido. Creo que la otra respuesta no se puede identificar el punto clave que nunca de trabajo. Así la gente podría leer esa respuesta y su toma de distancia podría ser acerca de las condiciones de carrera, especialmente en los que se ha upvoted, cuando en realidad es mucho más simple. Me imagino pasar horas tratando de uñas de la condición de carrera (que no es lo que hay 🙂

Dejar respuesta

Please enter your comment!
Please enter your name here