cfopenfclosefreopen

Create a file if one doesn't exist - C


I want my program to open a file if it exists, or else create the file. I'm trying the following code but I'm getting a debug assertion at freopen.c. Would I be better off using fclose and then fopen immediately afterward?

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

Solution

  • You typically have to do this in a single syscall, or else you will get a race condition.

    This will open for reading and writing, creating the file if necessary.

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

    If you want to read it and then write a new version from scratch, then do it as two steps.

    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);