Outils pour utilisateurs

Outils du site


nsi:langages:c:fichiers

Warning: Undefined array key 2 in /home/goupillf/wiki.goupill.fr/lib/plugins/codeprettify/syntax/code.php on line 214

Warning: Undefined array key 2 in /home/goupillf/wiki.goupill.fr/lib/plugins/codeprettify/syntax/code.php on line 214

Warning: Undefined array key 2 in /home/goupillf/wiki.goupill.fr/lib/plugins/codeprettify/syntax/code.php on line 214

Warning: Undefined array key 2 in /home/goupillf/wiki.goupill.fr/lib/plugins/codeprettify/syntax/code.php on line 214

Warning: Undefined array key 2 in /home/goupillf/wiki.goupill.fr/lib/plugins/codeprettify/syntax/code.php on line 214

Warning: Undefined array key 2 in /home/goupillf/wiki.goupill.fr/lib/plugins/codeprettify/syntax/code.php on line 214

Warning: Undefined array key 2 in /home/goupillf/wiki.goupill.fr/lib/plugins/codeprettify/syntax/code.php on line 214

Warning: Undefined array key 2 in /home/goupillf/wiki.goupill.fr/lib/plugins/codeprettify/syntax/code.php on line 214

Warning: Undefined array key 2 in /home/goupillf/wiki.goupill.fr/lib/plugins/codeprettify/syntax/code.php on line 214

Warning: Undefined array key 2 in /home/goupillf/wiki.goupill.fr/lib/plugins/codeprettify/syntax/code.php on line 214

Warning: Undefined array key 2 in /home/goupillf/wiki.goupill.fr/lib/plugins/codeprettify/syntax/code.php on line 214

Warning: Undefined array key 2 in /home/goupillf/wiki.goupill.fr/lib/plugins/codeprettify/syntax/code.php on line 214

Lecture / écriture de fichiers

La commande fopen

Il faut utiliser la commande fopen qui se trouve dans <stdio.h>

#include <stdio.h>

int main() {
    FILE* fichier = fopen("nom_du_fichier", "r");
}
  • FILE est un type défini dans <stdio.h>
  • fichier pointe sur le fichier.

Les modes

  • "r" : lecture seule
  • "w" : écriture seule (pas lecture !). Si le fichier n'existe pas, il est créé.
  • "a" : ajoute des données en fin de fichier. Si le fichier n'existe pas, il est créé.
  • "a+" : avec lecture en plus.
  • "r+" : lecture / écriture. Le fichier doit exister au préalable.
  • "w+" : lecture / écriture. Si le fichier n'existe pas, il est créé.

Tester le succès

En cas de problème, fichier reçoit la valeur NULL.

int main() {
    FILE* fichier = fopen("nom_du_fichier", "r");
    if (fichier == NULL) {
        // échec
        return 1;
    }
    // succès
    // suite du code...

    return 0;
}

Penser à fermer le fichier

On utilise fclose

int main() {
    FILE* fichier = fopen("nom_du_fichier", "r");
    if (fichier == NULL) {
        // échec
        return 1;
    }
    // succès
    // suite du code...

    // quand on fini de manipuler le fichier
    fclose(fichier);
    // suite de ce qu'on a à faire
    // ...
    
    return 0;
}

Écrire dans le fichier

Quand on écrit, il y a des flux :

  • Le flux standard pour écrire (sortie du point de vue de la machine) est l'écran. C'est stdout (standard output) qui reçoit l'id 1.
  • Notre variable fichier est aussi un identifiant.

Ainsi, quand on utilise printf on écrit forcément à l'écran, donc dans stdout. Il existe une autre commande, fprintf, qui permet de spécifier le flux cible.

  • fprintf(1, …) envoie vers stdout c'est donc la même chose que printf.
  • fprintf(fichier, …) envoie vers le fichier.

Autres commandes

  • fputc('A', fichier) permet d'ajouter le caractère A dans le fichier.
    Remarquez qu'en C on utilise les guillemets simples '...' pour un simple caractère.
  • fputs("lalala", fichier) permet d'ajouter une chaîne.

Lire dans un fichier

La encore nous avons des flux. Le flux standard pour lire (entrée du point de vue de la machine) est le clavier. C'est stdin (standard input) qui reçoit l'id 0

Il faut imaginer que l'on a un curseur de lecture. Le curseur est initialement placé sur le premier caractère et il avance à chaque lecture.

  • int c = fgetc(fichier); permet de lire le prochain caractère.
    Si on a atteint la fin du fichier, on reçoit EOF (End Of File)).
    int c = fgetc(fichier);
    while (c != EOF) {
        // traitement quelconque...
        c = fgetc(fichier);
    }
    
  • fgets permet de lire une chaîne. On lit au maximum n caractères. Si '\n' est rencontré, ne va pas plus loin.
    #define TAILLE_MAX 1000
     
    int main()
    {
        FILE* fichier = NULL;
        char chaine[TAILLE_MAX] = "";
        fichier = fopen("test.txt", "r");
        if (fichier == NULL) {
            return 1;
        }
        fgets(chaine, TAILLE_MAX, fichier); // lit au maximum TAILLE_MAX caractères du fichier
        // traitement sur chaine...
    
        fclose(fichier);
        return 0;
    }
    

Lecture formatée avec fscanf

De même que printf a sa version fprintf permettant de sélectionner le flux, scanf a sa version fscanf.

Supposons que le texte contienne 3 nombres 78 89 52. On peut récupérer ces nombres avec fscanf :

int main()
{
    FILE* fichier = NULL;
    int nombres[3];
 
    fichier = fopen("test.txt", "r");
 
    if (fichier == NULL) {
        return 1;
    }
    fscanf(fichier, "%d %d %d", &nombre[0], &nombre[1], &nombre[2]);

    // plus besoin du fichier
    fclose(fichier);

    // traitement voulu... par exemple on fait la somme :
    int s = nombre[0] + nombre[1] + nombre[2];
    printf("%d\n", s);
 
    return 0;
}

La précision de "%d %d %d" dans le format de fscanf permet de récupérer trois nombres en une fois. On aurait pu faire 3 fois un fscanf avec un format plus simple "%d".

nsi/langages/c/fichiers.txt · Dernière modification : de goupillwiki