begin process at 2010 02 10 07:51:52
  Trouver un code source :
 
dans
 
Accueil > Forum > 

C

 > 

Windows

 > 

Autre

 > 

Fusion de deux fichiers structurés


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

Fusion de deux fichiers structurés

jeudi 2 juillet 2009 à 21:09:44 | Fusion de deux fichiers structurés

morayma

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;
}
***********************************************************************
vendredi 3 juillet 2009 à 10:45:45 | Re : Fusion de deux fichiers structurés

Chouchou182

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,
--
Chouchou.

vendredi 3 juillet 2009 à 15:01:21 | Re : Fusion de deux fichiers structurés

morayma

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
vendredi 3 juillet 2009 à 15:34:55 | Re : Fusion de deux fichiers structurés

morayma

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
vendredi 3 juillet 2009 à 15:38:24 | Re : Fusion de deux fichiers structurés

Chouchou182

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,
--
Chouchou.

samedi 4 juillet 2009 à 10:49:48 | Re : Fusion de deux fichiers structurés

morayma

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


Cette discussion est classée dans : sizeof, fich, fread, e1, e2


Répondre à ce message

Sujets en rapport avec ce message

liste circulaire contigue [ par bidouza ] bonjour a tous,voila je suis sur un projet de "liste circulaire contigue" en langage c , mais là je coince sur la fonction supprimer, en fait je n'arr Problème avec vector<char> [ par gargourifahmi ] Salut, J'ai un pb dont je n'ai pas pu résoudre. En fait j'utilise un vecteur de caractère pour stocker des variables sous forme de caractères. Lors de sizeof( void* ) / sizeof( int ) sur processeur 64 bit [ par KeniiyK ] Bonsoir,Si quelqu'un a un processeur 64 bit, peut il me dire si l'adressage est sur 32 bits ou sur 64 bits ?Que valent les renvoies de sizeof( int ) e Que vaut sizeof(long) ? [ par fregolo52 ] Bonjour,J'ai cherché sans succès. Je voudrais tester la taille d'un long à la compilation. Je n'ai pas trouver de variable de compilation qui aurait c Probleme allocation dynamique [ par totoscill ] Bonjour,Je veux allouer de la mémoire dynamiquement pour 4 tableaux à 2 dimensions mais lors de l'éxécution, le test m'informe que l'allocation est im fwrite en mémoire.... [ par loicus ] Bonjour à tous...J'ai un très gros probleme.  Je travail avec des fichiers binaires en lecture et en écriture.Je n'ai aucun probleme avec l'utilisatio strtok et atof la memoire ne peut etre written [ par ciberrique ] Bonjours j'ai écris ce code mais il y a une erreur a l'execution de type la mémoire de ne peut etre "written".Il semlerait que l'erreur soit sur les l taille d'une structure à partir d'un pointeur sur la structure ? [ par rovkoupov ] Bonjour Je suis à la recherche d'une façon simple pour obtenir la taille en octet d'une struture à partir d'un pointeur sur cette structure. Avec la f Utilisation de createprocess [ par La marmote ] Bonjours, j utilise create process et j aimera definir la position ou ma fentre se lance et pourtant il veut pas les prendre en compte STARTUPINFO si icones bureau [ par sam20 ] Bonjour .Avec ce code j'ai la liste des icones du bureauvoid GetIcon(){ // récupération plateforme d'exécution OSVERSIONINFO osvi; osvi.dwOSVersionInf


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Février 2010
LMMJVSD
1234567
891011121314
15161718192021
22232425262728

Consulter la suite du CalendriCode

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,562 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales