45 votes

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

Je veux que mon programme ouvre un fichier s'il existe, ou bien crée le fichier. J'essaie le code suivant mais j'obtiens une assertion de débogage sur freopen.c. Est-ce que je ferais mieux d'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);
    } 

63voto

Dietrich Epp Points 72865

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

Cela s'ouvrira pour la lecture et l'é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 en deux étapes.

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

9voto

Shahbaz Points 22525

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

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

note : Comme le comportement de votre programme varie selon que le fichier est ouvert en lecture ou en écriture, vous aurez probablement aussi besoin de conserver une variable indiquant ce qui est 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;
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X