Ecrire et relire un fichier texte de deux manières.

Un exemple pour écrire et relire simplement dans un fichier texte en C, utilisant deux méthodes.

fscanf,fgets

Voir version :

Pas de dépendances

Télécharger :

#include <stdio.h>

void ecriture1()
{
    FILE* F;
    int a,b;
    double d;
    char* chaine = "plouf";
    printf("-- ecriture1\n");
    F = fopen("test.txt","w");
    a = 5;
    b = 6;
    d = 5.3;
    fprintf(F,"%d %f %d\n",a,d,b);
    fprintf(F,"%s\n",chaine);
    fclose(F);
}

void lecture1()
{
    FILE* F;
    int a;
    int b;
    double d;
    char chaine[500];
    printf("-- lecture1\n");
    F = fopen("test.txt","r");
    fscanf(F,"%d",&a);
    fscanf(F,"%lf",&d);
    fscanf(F,"%d",&b);
    fscanf(F,"%s",chaine);
    printf("%d %f %d %s\n",a,d,b,chaine);
    fclose(F);
}

void lecture2()
{
    FILE* F;
    char buf[1000];
    printf("-- lecture2\n");
    F = fopen("test.txt","r");
    while(!feof(F))
    {
        buf[0] = '\0';
        fgets(buf,1000,F);
        printf("%s",buf);
    }
    fclose(F);
}

int main()
{
    ecriture1();    
    lecture1();    
    lecture2();
    return 0;
}



Commentaires


  Voici un petit exemple d'acces au fichier en C.

  nous appelons la fonction ecriture1()
  Cette fonction ouvre un fichier F avec fopen : qu'elle ferme bien à la fin !

  Dans ce fichier, on écrit un int, puis un double, puis un int, puis une chaine.
  Entre chaque, il y a un espace, ou retour a la ligne.
  En effet, si vous ouvrez le fichier test.txt, qui est créé apres l'execution du programme, avec un bloc note, vous obtenez :

  5 5.3000000 6
  plouf

  Pour l'écriture, qu'ajouter ? tout simplement que vous pouvez écrire ce que vous voulez, avec fprintf, comme avec printf.

// lecture1

  La fonction lecture1() relis le fichier avec des fscanf (qui ressemblent a des scanf)
  Notez qu'on ouvre le fichier avec "r" comme READ (lecture), qu'on le referme touours a la fin de la fonction.

  On relis ensuite toutes les données, LES UNES APRES LES AUTRES, et DANS LE MEME ORDRE que lors de l'écriture...
  Comme avec scanf, ce que l'on passe, c'est des adresses (d'ou les &a, &d, &b)
  Une chaine étant déja une adresse, on passe chaine (tout court).
  Il est important de connaitre la fonction scanf pour comprendre tout ça.
  
  note : il est important, pour lire un "double", d'utiliser %lf, alors qu'un float est %f
  Dans un fichier texte, la valeur 5.300000 peut etre vue comme un double ou un float, peu importe, l'essentiel est
  de mettre %lf si derriere on met l'adresse d'un double, et %f si on met l'adresse d'un float.

  Il est également important de relire les données dans le bon ordre. En effet, dans le fichier texte, il n'est pas stocké que vous avez
  un int, puis un double, puis un int. Vous devez savoir ce que vous voulez lire.

  Amusez vous a changer l'ordre des fscanf (pour lire d'abord un double, puis une chaine, puis un int par exemple)
  --> vous récuperez n'importe quoi. Essayez :) vous ne risquez rien...

  note : fscanf sépare les données lues quand il detecte un espace, ou un retour chariot.
  Vous pouvez mettre plusieurs espace, des sauts de ligne, fscanf ira chercher la prochaine donnée : il n'y a pas de contraintes de "mise en forme"
  si j'ose dire : la seule chose importante est l'ordre dans lequel sont rangées les données.

  Il en découle que si dans "ecriture1", vous oubliez un espace lors de l'écriture, par exemple entre le premier int, et le double, vous aurez :

  55.3000000 6
  plouf

  Et la, il n'y a aucune trace que vous avez écrit le 5, puis le 5.300000.
  Du coup, fscanf ne relira pas correctement le fichier dans le cas : pour lui 55.300000 est une seule donnée.

  Faite donc attention a la façon dont vous écrivez, et la façon dont vous lisez.

// lecture2

  La lecture 2 utilise une autre méthode pour relire les fichiers texte. La méthode "par ligne"
  Contrairement a fscanf qui s'arrete quand il croise un espace, fgets ira jusqu'au prochain saut de ligne.
  il gardera d'ailleurs le caractere de saut de ligne en fin de chaine.
  C'est pour cela que quand on met :

  printf("%s",buf);

  plusieurs fois de suite, il y a bien le saut de ligne entre les lignes, alors qu'il n'y a pas de \n dans le printf.

  fgets attend 2 parametres : un buffer (une chaine), et une taille maximale.
  la taille maximale (que j'ai mis arbitrairement ici a 1000) permet d'empecher les débordements.
  Vous dites a fgets qu'il ne pourra lire que, MAXIMUM, 1000 caracteres. Si la ligne en contient davantage, le reste est ignoré.

  La ligne suivante :

  while(!feof(F))

  veut dire : "tant que le fichier n'est pas fini : feof voulant dire "File : END OF FILE" "
  en gros, dans lecture2, tant que j'ai pas tout lu, je continue a lire...

  L'inconvénient de fgets est qu'elle récupere la chaine en tant que chaine : pour lui, la premiere chaine n'est un int, un double et un int, 
  c'est juste une chaine. 
  A vous de la découper si le coeur vous en dit apres.

  Cette fonction est idéale pour un fichier texte qui contient des phrases....
  Alors que fscanf sera davantage utilisé pour un fichier texte contenant des données...

  Cela dit, on peut tres bien lire mot par mot avec fscanf. Tout est possible avec les fichiers texte !!