Previous Next Up Index Contents

11.7.1. Ajouter un enregistrement à un fichier

Nous pouvons ajouter le nouvel enregistrement à différentes positions dans le fichier:

a) Ajoute à la fin du fichier

L'ancien fichier est entièrement copié dans le nouveau fichier, suivi du nouvel enregistrement.

b) Ajoute au début du fichier

L'ancien fichier est copié derrière le nouvel enregistrement qui est écrit en premier lieu.

c) Insertion dans un fichier trié relativement à une rubrique commune des enregistrements

Le nouveau fichier est créé en trois étapes:

- copier les enregistrements de l'ancien fichier qui précèdent le nouvel enregistrement,

- écrire le nouvel enregistrement,

- copier le reste des enregistrements de l'ancien fichier.

Le programme suivant effectue l'insertion d'un enregistrement à introduire au clavier dans un fichier trié selon la seule rubrique de ses enregistrements: le nom d'une personne. Le programme inclut en même temps les solutions aux deux problèmes précédents. La comparaison lexicographique des noms des personnes se fait à l'aide de la fonction strcmp.

Solution en C

#include <stdio.h>
#include <string.h>

main()
{
  /* Déclarations : */
  /* Noms des fichiers et pointeurs de référence */
  char ANCIEN[30], NOUVEAU[30]; 
  FILE *INFILE, *OUTFILE;
  /* Autres variables */
  char NOM_PERS[30], NOM_AJOUT[30];
  int TROUVE;

  /* Ouverture de l'ancien fichier en lecture */
  do
    {
     printf("Nom de l'ancien fichier : ");
     scanf("%s", ANCIEN);
     INFILE = fopen(ANCIEN, "r"); 
     if (!INFILE) 
         printf("\aERREUR: Impossible d'ouvrir "
                "le fichier: %s.\n", ANCIEN);
    }
  while (!INFILE);
  /* Ouverture du nouveau fichier en écriture */
  do
    {
     printf("Nom du nouveau fichier : ");
     scanf("%s", NOUVEAU);
     OUTFILE = fopen(NOUVEAU, "w"); 
     if (!OUTFILE) 
         printf("\aERREUR: Impossible d'ouvrir "
                "le fichier: %s.\n", NOUVEAU);
    }
  while (!OUTFILE);
  /* Saisie de l'enregistrement à insérer */
  printf("Enregistrement à insérer : ");
  scanf("%s",NOM_AJOUT);

 /* Traitement */
  TROUVE = 0;
  /* Copie des enregistrements dont le nom */
  /* précéde lexicogr. celui à insérer.*/
  while (!feof(INFILE) && !TROUVE)
    {
     fscanf(INFILE, "%s\n", NOM_PERS);
     if (strcmp(NOM_PERS, NOM_AJOUT) > 0)
         TROUVE = 1;
     else
         fprintf(OUTFILE, "%s\n", NOM_PERS);
    }
  /* Ecriture du nouvel enregistrement,  */
  fprintf(OUTFILE, "%s\n", NOM_AJOUT);
  /* suivi du dernier enregistrement lu. */
  if (TROUVE) fprintf(OUTFILE, "%s\n", NOM_PERS);
  /* Copie du reste des enregistrements */
  while (!feof(INFILE))
    {
     fscanf(INFILE, "%s\n", NOM_PERS);
     fprintf(OUTFILE, "%s\n", NOM_PERS);
    }
  /* Fermeture des fichiers */
  fclose(OUTFILE);
  fclose(INFILE);
  return 0;
} 


Previous Next Up Index Contents

Feedback - Copyright © 1993,1996,1997 F.Faber