Advanced Programming Workshop: Text Files

Ce cours explique l'utilisation des fichiers textes en langage C. Il détaille l'utilisation des fonctions d'écriture et de lecture comme fprintf, fscanf, fputs et fgets à travers des exemples pratiques.

D'après le document Advanced Programming Workshop: Text Files

Cet article a été rédigé automatiquement à partir du document source, puis vérifié avant publication.

Advanced Programming Workshop: Text Files

Document source

Advanced Programming Workshop: Text Files

Programming in C · PDF · 5 pages · 2011

Afficher l'aperçu du document

Consulter le document original →

Ce cours de programmation avancée traite de la manipulation des fichiers textes en langage C. Il détaille la création, le remplissage et l’affichage de fichiers textes contenant des structures de données complexes, notamment à l'aide des fonctions fprintf, fscanf, fputs et fgets.

Structures de données et ouverture de fichiers texte

La gestion structurée des informations repose sur la définition préalable de types personnalisés en C, tels que la date et la fiche étudiant.

  • DATE : contient les champs jour, mois et annee.
  • ETUDIANT : contient le code étudiant ce, le tableau nom[20], la date de naissance date_naiss et la moyenne moy.

Pour ouvrir un fichier texte en mode lecture et écriture, on utilise la fonction ouverture :

void ouverture (FILE **fp)
{
  char nf[20];
  printf("saisir nom fichier");
  gets(nf);
  *fp = fopen(nf, "wt+");
}

Remplissage d’un fichier texte avec des données d’étudiants

Le remplissage d'un fichier texte s'effectue via l'écriture formatée de variables en mémoire.

  • La première variante s'appuie sur la fonction saisir_etudiant, qui renvoie la valeur 0 pour interrompre la saisie lorsque le code saisi est égal à -1.
  • La seconde variante gère la boucle de saisie directement dans la fonction principale de remplissage.

Dans les deux approches, l'écriture des données dans le fichier s'effectue avec fprintf selon un format prédéfini :

fprintf(fp, "%5d %20s %2d %2d %4d %5.2f\n", etd.ce, etd.nom, etd.date_naiss.jour, etd.date_naiss.mois, etd.date_naiss.annee, etd.moy);

Affichage du contenu d’un fichier texte

La lecture séquentielle d'un fichier texte préserve la mise en forme initiale des données enregistrées.

void affichage_fichier(FILE *fp)
{
  ETUDIANT etd;
  while(1)
  {
    fscanf(fp, "%d%s%d%d%d%f", &etd.ce, etd.nom, &etd.date_naiss.jour, &etd.date_naiss.mois, &etd.date_naiss.annee, &etd.moy);
    printf("\n le ce est: %5d, le nom est %20s, la date de naissance est %2d / %2d / %4d, et la moyenne est %5.2f \n",
           etd.ce, etd.nom, etd.date_naiss.jour, etd.date_naiss.mois, etd.date_naiss.annee, etd.moy);
    if(feof(fp)) break;
  }
}

Fonctions fputs et fgets pour la gestion des chaînes de caractères

Les fonctions fputs et fgets facilitent le traitement direct des lignes et chaînes de caractères sans formatage complexe.

La fonction fputs écrit une chaîne dans un flux sans ajouter automatiquement de saut de ligne :

  • fputs(s, fp); écrit la chaîne s dans le fichier désigné par le pointeur fp.
  • Elle retourne une valeur non négative en cas de succès, ou la constante EOF en cas d’erreur.
  • Trois appels successifs à fputs("bonjour", fp); écrivent la chaîne "bonjourbonjourbonjour" sur une seule ligne.
  • Pour insérer un saut de ligne, il convient d'utiliser fprintf(fp, "%s\n", s);.

La fonction fgets permet de lire une chaîne de caractères depuis un fichier :

  • fgets(s, n, fp); lit au plus n - 1 caractères dans le tampon s, en incluant le caractère de fin de ligne \n si celui-ci est rencontré.
  • Elle renvoie l’adresse de la chaîne lue ou le pointeur NULL en cas d’erreur ou de fin de fichier.
  • Un caractère nul de fin de chaîne \0 est automatiquement ajouté à la suite des caractères lus.

Programme complet de gestion d’un fichier texte d’étudiants

L'exemple ci-dessous illustre l'écriture et la lecture de lignes complètes représentées sous forme de chaînes de caractères dans un fichier texte.

void remplir(FILE *fp)
{
  int val;
  char ch[100];
  while(1)
  {
    printf("saisir un étudiant: ce, nom, date naissance, moyenne \n");
    gets(ch);
    if(*ch == '0') break;
    val = fputs(ch, fp);
    if(val == EOF) printf("erreur d'écriture");
    fputs("\n", fp);
  }
}

void afficher(FILE *fp)
{
  char ch[100];
  rewind(fp);
  while(fgets(ch, 100, fp))
    puts(ch);
}

La seconde version de la fonction afficher extrait les données d'une ligne lue avec fgets vers la structure ETUDIANT au moyen de la fonction sscanf :

void afficher(FILE *fp)
{
  char ch[100];
  ETUDIANT etd;
  rewind(fp);
  while(fgets(ch, 100, fp))
  {
    sscanf(ch, "%d%s%d%d%d%f", &etd.ce, etd.nom, &etd.date_naiss.jour, &etd.date_naiss.mois, &etd.date_naiss.annee, &etd.moy);
    printf("ce:%d   nom:%s  jour:%d   mois:%d   annee:%d    moy:%5.2f\n",
           etd.ce, etd.nom, etd.date_naiss.jour, etd.date_naiss.mois, etd.date_naiss.annee, etd.moy);
  }
}

Programme principal

La fonction main orchestre l'ouverture du fichier, la saisie des données, le repositionnement du pointeur de fichier via rewind, la lecture et la fermeture du flux.

void main()
{
  FILE *fp;
  ouverture(&fp);
  remplir(fp);
  rewind(fp);
  afficher(fp);
  fclose(fp);
}

Points clés

  • Les fichiers textes sont manipulés avec fprintf, fscanf, fputs et fgets pour l'écriture et la lecture de données formatées ou de chaînes.
  • La structure ETUDIANT permet de regrouper les informations individuelles, incluant une sous-structure pour la date de naissance.
  • fputs n'ajoute pas de caractère de fin de ligne \n lors de l'écriture dans un fichier.
  • fgets préserve le caractère de fin de ligne \n et termine la chaîne lue par un caractère nul \0.
  • La fonction rewind réinitialise le pointeur de position au début du fichier pour permettre une lecture immédiatement après l'écriture.

Partager

Commentaires

Aucun commentaire pour le moment. Posez la première question.

Les commentaires sont relus avant publication. Votre e-mail n'est jamais affiché.

← Toutes les révisions