Fusion de deux fichiers structurés

tdaouas Messages postés 27 Date d'inscription lundi 23 janvier 2006 Statut Membre Dernière intervention 23 octobre 2017 - 2 juil. 2009 à 21:09
tdaouas Messages postés 27 Date d'inscription lundi 23 janvier 2006 Statut Membre Dernière intervention 23 octobre 2017 - 4 juil. 2009 à 10:49
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

cs_Chouchou182 Messages postés 252 Date d'inscription vendredi 13 juin 2003 Statut Membre Dernière intervention 25 avril 2011 1
3 juil. 2009 à 10:45
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,
0
tdaouas Messages postés 27 Date d'inscription lundi 23 janvier 2006 Statut Membre Dernière intervention 23 octobre 2017
3 juil. 2009 à 15:01
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
0
tdaouas Messages postés 27 Date d'inscription lundi 23 janvier 2006 Statut Membre Dernière intervention 23 octobre 2017
3 juil. 2009 à 15:34
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
0
cs_Chouchou182 Messages postés 252 Date d'inscription vendredi 13 juin 2003 Statut Membre Dernière intervention 25 avril 2011 1
3 juil. 2009 à 15:38
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,
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
tdaouas Messages postés 27 Date d'inscription lundi 23 janvier 2006 Statut Membre Dernière intervention 23 octobre 2017
4 juil. 2009 à 10:49
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
0
Rejoignez-nous