Fusion de deux fichiers structurés

Signaler
Messages postés
27
Date d'inscription
lundi 23 janvier 2006
Statut
Membre
Dernière intervention
23 octobre 2017
-
Messages postés
27
Date d'inscription
lundi 23 janvier 2006
Statut
Membre
Dernière intervention
23 octobre 2017
-
J'ai écris un programme en C qui fusionne deux fichiers avec la même structure d'employés et ordonnés par ordre alphabétique croissant des noms. J'ai mis le code en bas. J'ai un problème avec la fonction fread, elle ne fait pas avancer séquentiellement la lecture dans les deux fichiers à fusionner pour lire. Quelqu'un pourrait m'aider SVP. Merci
**************************************************
#include <stdio.h>
#include <ctype.h>
#include <string.h>

char t;

int main()
{
typedef
struct
{
char nom[40];
int age;
char sexe[1];
char fonction[20];
}Employe;

Employe e1, e2;
FILE * fich1;
FILE * fich2;
FILE * fich;

fich1 = fopen("f1", "r") ;
fich2 = fopen("f2", "r") ;
fich = fopen("f", "w") ;


fread(&e1, sizeof(e1), 1, fich1);
fread(&e2, sizeof(e2), 1, fich2);

while ((e1.nom != "0") && (e2.nom != "0"))

{
if (strcmp(e1.nom,e2.nom)<0)
{
printf("%s%s", "Ajout de ", e1.nom);
fwrite(&e1, sizeof(e1), 1, fich);
fread(&e1, sizeof(e1), 1, fich1);
scanf("%s", &t);
}
else
{
printf("%s%s", "Ajout de ", e2.nom);
fwrite(&e2, sizeof(e2), 1, fich);
fread(&e2, sizeof(e2), 1, fich2);
scanf("%s", &t);
}

}

while (e1.nom !="0")

{
printf("%s%s", "Ajout de ", e1.nom);
fwrite(&e1, sizeof(e1), 1, fich);
fread(&e1, sizeof(e1), 1, fich1);
scanf("%s", &t);
}
while (e2.nom !="0")
{
printf("%s%s", "Ajout de ", e2.nom);
fwrite(&e2, sizeof(e2), 1, fich);
fread(&e2, sizeof(e2), 1, fich2);
scanf("%s", &t);
}
fclose(fich1);
fclose(fich2);
fclose(fich);

return 0;
}
***********************************************************************

5 réponses

Messages postés
252
Date d'inscription
vendredi 13 juin 2003
Statut
Membre
Dernière intervention
25 avril 2011

Bonjour,

Ce test est toujours vrai:
(e1.nom != "0")
Ces adresses que tu compares sont définies à la compilation et ne peuvent changer au cours de l'exécution du programme. Utilise strcmp pour comparer le contenu de chaînes de caractères, comme tu le fais ailleurs.

Les fonctions fread, fwrite, scanf renvoient des valeurs. Il faut étudier la valeur de retour. cf. man 3 pour plus de détails.

Bonne prog,
Messages postés
27
Date d'inscription
lundi 23 janvier 2006
Statut
Membre
Dernière intervention
23 octobre 2017

Merci Chouchou pour ta réponse rapide. Oui j'ai rectifié selon tes remarques. Mon problème reste toujours que la fonction fread ne fait pas avancer vers l'enregistrement suivant, ce qui fait que le programme reste bloqué sur le premier enregistrement et boucle!!!

No dejes para mañana lo que puedes hacer hoy
Messages postés
27
Date d'inscription
lundi 23 janvier 2006
Statut
Membre
Dernière intervention
23 octobre 2017

Re bonjour Chouchou,

Ca y est j'ai résolu mon problème. En fait, il fallait utiliser la fonction fseek avant chaque fread et ça a marché. Donc d'après ce que je comprends, il faut se positionner sur l'enregistrement puis le lire avec fread.

fseek(fich, sizeof(e)*num, SEEK_SET); // avec num le rang de l'enregistrement dans le fuchier.

Merci encore pour ton aide.

No dejes para mañana lo que puedes hacer hoy
Messages postés
252
Date d'inscription
vendredi 13 juin 2003
Statut
Membre
Dernière intervention
25 avril 2011

Que penses-tu de tester si la fin des fichiers est atteinte ?
Par exemple ainsi:

fread(&e1, sizeof(e1), 1, fich1);
fread(&e2, sizeof(e2), 1, fich2);

do
  {
    if (strcmp(e1.nom,e2.nom)<0 && !feof(fich1))
      {
          printf("%s%s", "Ajout de ", e1.nom);
          fwrite(&e1, sizeof(e1), 1, fich);
          fread(&e1, sizeof(e1), 1, fich1);
          scanf("%s", &t);
      }
      else
      {
          printf("%s%s", "Ajout de ", e2.nom);
          fwrite(&e2, sizeof(e2), 1, fich);
          fread(&e2, sizeof(e2), 1, fich2);
          scanf("%s", &t);
      }

  } while (!feof(fich1) || !feof(fich2));

Il faut aussi rajouter des tests pour savoir si fread, fwrite et scanf font ce que l'on attend.

Bonne prog,
Messages postés
27
Date d'inscription
lundi 23 janvier 2006
Statut
Membre
Dernière intervention
23 octobre 2017

Oui c'est peut être possible avec le teste de fin de fichier, sauf que mes deux fichiers à fusionner se terminent avec un nom égale à zéro. C'est plutôt ça mon test de fin de fichier.

Merci

No dejes para mañana lo que puedes hacer hoy