Friday, November 1, 2013

Les fichiers s�quentiels en C

Exercice

Deux fichiers FA et FB dont les noms sont � entrer au clavier contiennent des nombres entiers tri�s dans l'ordre croissant. Ecrire un programme qui copie le contenu de FA et FB respectivement dans les tableaux TABA et TABB dans la m�moire centrale. Les tableaux TABA et TABB sont fusionn�s dans un troisi�me tableau tri� en ordre croissant TABC. Apr�s la fusion, la tableau TABC est sauv� dans un fichier FC dont le nom est � entrer au clavier.
La m�moire pour TABA, TABB et TFUS dont les nombres d'�l�ments sont inconnus, est r�serv�e dynamiquement apr�s que les longueurs des fichiers FA et FB ont �t� d�tect�es.

#include <stdio.h>
#include <stdlib.h>
main()
{
  /* Prototype de la fonction FUSION */
  void FUSION(int *A, int *B, int *FUS, int N, int M);
   /* D�clarations : */
  /* Noms des fichiers et pointeurs de r�f�rence */
  char FICH_A[30], FICH_B[30], FICH_FUS[30];
  FILE *FA, *FB, *FFUS;
  /* Autres variables */
  int *TABA, *TABB, *TFUS; /* pointeurs pour les tableaux */
  int LA, LB; /* Longueurs de FA et FB */
   int N; /* Nombre lu ou �crit dans un fichier */
  int I; /* Indice d'aide */

  /* Ouverture du fichier FA en lecture */
   do
    {
     printf("Nom du fichier FA : ");
     scanf("%s", FICH_A);
     FA = fopen(FICH_A, "r");
     if (!FA)
         printf("\aERREUR: Impossible d'ouvrir "
                "le fichier: %s.\n", FICH_A);
    }
  while (!FA);
  /* D�tection de la longueur de FA */
  for (LA=0; !feof(FA); LA++)
       fscanf(FA,"%d\n", &N);
  /* Fermeture du fichier FA */
  fclose(FA);
  /* Allocation de la m�moire pour TABA */
  TABA = malloc (LA*sizeof(int));
   if (!TABA)
       {
        printf("\a Pas assez de m�moire pour TABA\n");
        exit(-1);
       }


  /* R�ouverture du fichier FA en lecture */
  FA = fopen(FICH_A, "r");
  /* Copie du contenu de FA dans TABA */
  for (I=0; I<LA; I++)
       fscanf(FA,"%d\n", TABA+I);
  /* Fermeture du fichier FA */
  fclose(FA);
 
  /* M�mes op�rations pour FB : */
  /* Ouverture du fichier FB en lecture */
   do
    {
     printf("Nom du fichier FB : ");
     scanf("%s", FICH_B);
     FB = fopen(FICH_B, "r");
     if (!FB)
         printf("\aERREUR: Impossible d'ouvrir "
                "le fichier: %s.\n", FICH_B);
    }
  while (!FB);
  /* D�tection de la longueur de FB */
  for (LB=0; !feof(FB); LB++)
       fscanf(FB,"%d\n", &N);
  /* Fermeture du fichier FB */
  fclose(FB);
  /* Allocation de la m�moire pour TABB */
  TABB = malloc (LB*sizeof(int));
   if (!TABB)
       {
        printf("\a Pas assez de m�moire pour TABB\n");
        exit(-1);
       }
  /* R�ouverture du fichier FB en lecture */
  FB = fopen(FICH_B, "r");
  /* Copie du contenu de FB dans TABB */
  for (I=0; I<LB; I++)
       fscanf(FB,"%d\n", TABB+I);
  /* Fermeture du fichier FB */
  fclose(FB);
 
  /* Allocation de la m�moire pour TFUS */
   TFUS = malloc ((LA+LB)*sizeof(int));
  if (!TFUS)
       {
        printf("\a Pas assez de m�moire pour TFUS\n");
        exit(-1);
       }

  /* Fusion des tableaux TA et TB dans TFUS */
  FUSION (TABA, TABB, TFUS, LA, LB);


  /* Ouverture du fichier FFUS en �criture */
   do
    {
     printf("Nom du fichier FFUS : ");
     scanf("%s", FICH_FUS);
     FFUS = fopen(FICH_FUS, "w");
     if (!FFUS)
         printf("\aERREUR: Impossible d'ouvrir "
                "le fichier: %s.\n", FICH_FUS);
    }
  while (!FFUS);
  /* Copier le contenu de TFUS dans FFUS */
  for (I=0; I<(LA+LB); I++)
       fprintf(FFUS,"%d\n", *(TFUS+I));
  /* Fermeture du fichier FFUS */
  fclose(FFUS);
   return 0;
}

void FUSION(int *A, int *B, int *FUS, int N, int M)
{
  /* Variables locales */
 /* Indices courants dans A, B et FUS */
 int IA,IB,IFUS; 

 /* Fusion de A et B dans FUS */
 IA=0, IB=0; IFUS=0;
 while ((IA<N) && (IB<M))
    if (*(A+IA)<*(B+IB))
        {
         *(FUS+IFUS)=*(A+IA);
         IFUS++;
         IA++;
        }
    else
        {
         FUS[IFUS]=B[IB];
         IFUS++;
         IB++;
        }
 /* Si A ou B sont arriv�s � la fin, alors */
 /* copier le reste de l'autre tableau.    */
 while (IA<N)
     {
      *(FUS+IFUS)=*(A+IA);
      IFUS++;
      IA++;
     }
 while (IB<M)
     {
      *(FUS+IFUS)=*(B+IB);
      IFUS++;
      IB++;
     }
}

No comments:

Post a Comment