Les Fichiers Textes

Ce cours s'adresse aux étudiants de première année en informatique et présente les notions fondamentales pour manipuler des fichiers textes en langage C. Il explique comment créer, remplir et afficher des fichiers textes contenant des données d'étudiants, en utilisant les fonctions standard d'entrée/sortie comme fprintf, fscanf, fputs et fgets.

D'après le document Les Fichiers Textes

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

Les Fichiers Textes

Document source

Les Fichiers Textes

Programming (File Handling in C) · PDF · 5 pages · 2011

Afficher l'aperçu du document

Consulter le document original →

Ce cours s'adresse aux étudiants de première année en informatique et présente les notions fondamentales pour manipuler des fichiers textes en langage C. Il explique comment créer, remplir et afficher des fichiers textes contenant des données d'étudiants, en utilisant les fonctions standard d'entrée/sortie comme fprintf, fscanf, fputs et fgets.

Structures de données pour les étudiants

Pour gérer les informations des étudiants, deux structures sont définies :

  • DATE : contient les champs jour, mois, et annee.
  • ETUDIANT : contient un entier ce (carte d'étudiant), un tableau de caractères nom[20], une date de naissance date_naiss de type DATE, et une moyenne moy de type float.

Ouverture d’un fichier texte

La fonction ouverture demande à l'utilisateur le nom du fichier à créer ou ouvrir en mode texte « wt+ » (écriture et lecture, fichier vidé s'il existe) :

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

Remplissage d’un fichier texte avec des étudiants

Deux versions sont proposées pour remplir un fichier texte :

Version 1 : avec fonction de saisie

La fonction saisir_etudiant lit les données d’un étudiant depuis l’entrée standard. La saisie s’arrête si ce vaut -1.

int saisir_etudiant (ETUDIANT *etd)
{
  printf("\n saisir ce, nom, date de naissance et moyenne \n");
  scanf("%i", &etd->ce);
  if (etd->ce == -1) return 0;
  scanf("%s%d%d%d%f", etd->nom, &etd->date_naiss.jour, &etd->date_naiss.mois,
        &etd->date_naiss.annee, &etd->moy);
  return 1;
}

La fonction remplir_fichier appelle cette fonction dans une boucle et écrit chaque étudiant dans le fichier avec fprintf :

void remplir_fichier(FILE *fp)
{
  ETUDIANT etd;
  while (saisir_etudiant(&etd))
    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);
}

Version 2 : saisie et écriture dans la même boucle

void remplir_fichier(FILE *fp)
{
  ETUDIANT etd;
  while (1)
  {
    printf("\n saisir ce, nom, date de naissance et moyenne \n");
    scanf("%d", &etd.ce);
    if (etd.ce == -1) break;
    scanf("%s%d%d%d%f", etd.nom, &etd.date_naiss.jour, &etd.date_naiss.mois,
          &etd.date_naiss.annee, &etd.moy);
    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 fonction affichage_fichier lit les données du fichier avec fscanf et affiche chaque étudiant :

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

Utilisation des fonctions fputs et fgets

fputs écrit une chaîne de caractères dans un fichier sans ajouter de saut de ligne :

  • Syntaxe : fputs(s, fp); où s est une chaîne et fp un fichier ouvert.
  • Retourne une valeur non négative en cas de succès, EOF en cas d’erreur.

Exemple :

for(i = 0; i < 3; i++) fputs("bonjour", fp);
// Contenu du fichier : bonjourbonjourbonjour

Pour écrire avec saut de ligne :

for(i = 0; i < 3; i++)
  fprintf(fp, "%s\n", "bonjour");
// Contenu du fichier :
// bonjour
// bonjour
// bonjour

fgets lit une chaîne depuis un fichier, incluant le caractère de fin de ligne \n si rencontré :

  • Syntaxe : fgets(s, n, fp); où s est la zone mémoire, n la taille maximale à lire, fp le fichier.
  • Retourne l’adresse de s si succès, NULL en cas d’erreur ou fin de fichier sans lecture.
  • Le caractère \n est conservé dans la chaîne si rencontré avant la limite.
  • Un caractère nul \0 termine la chaîne.

Exemple complet : remplir et afficher un fichier texte avec fputs et fgets

Ce programme remplit un fichier texte avec des lignes saisies par l’utilisateur, puis affiche son contenu.

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;  // arrêt si saisie '0'
    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);
}

Version améliorée d’affichage avec analyse des données

On peut aussi analyser chaque ligne lue avec sscanf pour extraire les champs et les afficher formatés :

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

Glossaire des termes clés

  • fopen : fonction d’ouverture d’un fichier, retourne un pointeur vers FILE.
  • fprintf : écrit des données formatées dans un fichier.
  • fscanf : lit des données formatées depuis un fichier.
  • fputs : écrit une chaîne de caractères dans un fichier sans ajouter de saut de ligne.
  • fgets : lit une chaîne de caractères depuis un fichier, incluant le caractère de fin de ligne.
  • rewind : replace le curseur de lecture/écriture au début du fichier.
  • feof : teste la fin de fichier.
  • sscanf : lit des données formatées depuis une chaîne de caractères.
  • structure : type composite regroupant plusieurs variables sous un même nom.
  • EOF : constante indiquant la fin de fichier ou une erreur lors d’une opération d’entrée/sortie.

Points clés à retenir

  • Les fichiers textes en C sont manipulés avec des fonctions comme fprintf, fscanf, fputs et fgets.
  • La structure ETUDIANT permet de regrouper les informations d’un étudiant pour faciliter la lecture et l’écriture.
  • La saisie utilisateur peut être contrôlée pour arrêter la lecture avec une valeur sentinelle (par exemple ce = -1 ou saisie "0").
  • fputs n’ajoute pas de saut de ligne, contrairement à fprintf(fp, "%s\n", s).
  • fgets conserve le caractère de fin de ligne \n dans la chaîne lue, ce qui facilite la lecture ligne par ligne.
  • Il est important de repositionner le curseur du fichier avec rewind avant la lecture après écriture.
  • La fonction sscanf permet d’extraire des données formatées à partir d’une chaîne lue avec fgets.

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