web-dev-qa-db-fra.com

Créer un fichier s'il n'en existe pas - C

Je souhaite que mon programme ouvre un fichier s'il existe ou le crée. J'essaie le code suivant mais je reçois une assertion de débogage à l'adresse freopen.c. Aurais-je intérêt à utiliser fclose puis fopen immédiatement après?

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

Vous devez généralement le faire en un seul appel système, sinon vous obtiendrez une situation de concurrence critique.

Cela ouvrira en lecture et en écriture, créant le fichier si nécessaire.

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

Si vous voulez le lire puis écrire une nouvelle version à partir de zéro, procédez comme suit.

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);
53
Dietrich Epp

Si fptr est NULL, vous n'avez pas de fichier ouvert. Par conséquent, vous ne pouvez pas le freopen, vous devriez simplement le fopen le.

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

note: Étant donné que le comportement de votre programme varie selon que le fichier est ouvert en mode lecture ou écriture, vous devez probablement également conserver une variable indiquant le cas.

Un exemple complet

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;
}
9
Shahbaz