IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C Discussion :

Double parcours de fichiers


Sujet :

C

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Août 2009
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 3
    Points : 2
    Points
    2
    Par défaut Double parcours de fichiers
    Bonjour,

    Cela fait quelques jours que je bloque sur un problème. J'ai beau le triturer dans tout les sens, quitte à sacrifier toute performance, toujours rien. Le but: Creer un programme me permettant de comparer le contenu d'un fichier csv avec celui d'un autre fichier. En algo, j'ai donc retenu:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
    Ouverture fichier1
    Ouverture fichier2
     
    Tant que fin fichier1 non atteint{
    	Recuperez ligne courante
    	Tant que fin fichier2 non atteint{
    		Recuperez ligne courante
    		...
    		...
    		...
    		traitements et tests entre ligne fichier1 et fichier2
    		...
    	}
    }
     Fermeture fichier1
     Fermeture fichier2
    Pour chaque ligne de fichier1 je vais la comparer à toutes les lignes de fichier2. La comparaison ligne a ligne est exclu car les enregistrements ne sont pas forcément dans le même ordre (une des erreurs habituelles est la disparition d'une ligne ce qui engendre un décalage sur tout le reste du fichier).

    Pour l'instant, je cherche juste un code qui enregistre dans un fichier la premiere ligne du fichier1 puis la premiere ligne du fichier2 puis la deuxieme ligne du fichier1... Mes fonctions de tests sont déjà prêtes et fonctionnelles.

    Au niveau du code j'ai:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    	import1 = fopen("resultats1.txt", "r");
    	import2 = fopen("resultats2.txt", "r");
    	export1 = fopen("resultats3.txt", "a+");
     
    		while (!feof(import1)){
    			fgets(chaine1, 256, import1);
    			while(!feof(import2){
    				fgets(chaine2, 256, import2);
    				fputs(chaine1,export1);
    				fputs(chaine2,export1);
    			}
    		}
    Le soucis avec ce code, c'est que chaine1 ne prend que la valeur de la ligne 1. J'ai vérifié le curseur avec ftell() et en effet, le curseur reste planté sur 0 pour fichier1. J'ai tenté de contourner le problème en faisant un parcours total de fichier 1 et en enregistrant la position de chaque début de ligne. Puis je calculais l'ecart entre chacune des valeurs et finalement j'utilisais fseek(fichier,différence entre la position de la prochaine ligne - et celle du début de la ligne courante, position du curseur). La, je suis tombé dans le maraboutisme aigue. Mon tableau qui avait les curseurs en mémoire était bien remplis puis dès que j'utilisais un fgets/fseek, toutes les valeurs du tableau passent à 0... J'ai pas pris de drogue, j'ai rien bu, rien fumer.

    Structure des fichiers

    1111;2222;3333
    aaa;bbb;ccc
    77777;66666;55555;

    Mon avis/intuition/mes pistes: fgets utilisé dans une double boucle déplace toujours le curseur en début de fichier et par je ne sais quelle magie, efface le tableau où j'ai stocké les curseurs. Sinon, un problème de EoF ou alors, c'est une mauaise idée d'imbriquer des parcours de fichiers, le systeme confond tout les curseurs, pointeurs, EoF...

    Merci de votre aide, si jamais je n'ai pas été assez précis, je suis à l'écoute pour compléter.

  2. #2
    Expert éminent sénior
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Points : 13 926
    Points
    13 926
    Par défaut
    Mon avis/intuition/mes pistes: fgets utilisé dans une double boucle déplace toujours le curseur en début de fichier et par je ne sais quelle magie, efface le tableau où j'ai stocké les curseurs. Sinon...
    Non, fgets se comporte tout à fait bien.

    Je verrai quelque chose du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
     
    // ouverture (correcte, à vérifier des fichiers
      while(   (res1 = fgets(chaine1, 256, import1)) != NULL
            && (res2= fgets(chaine2, 256, import2))!= NULL)
      {
          fputs(chaine1,export1);
          fputs(chaine2,export1);
      }
      // au moins un des deux fichiers est terminé
      // copier la fin de l'autre (?)
      if(res1 != NULL)
      {
          fputs(chaine1,export1); // copier la ligne déjà lue et la suite de import1
          while(fgets(chaine1, 256, import1) != NULL) fputs(chaine1,export1);
      }
      if(res2 != NULL)
      {
         fputs(chaine2,export1); // copier la ligne déjà lue et la suite de import2
         while(fgets(chaine2, 256, import2)!= NULL)	fputs(chaine2,export1);
      }
    Code non testé
    Publication : Concepts en C

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Août 2009
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 3
    Points : 2
    Points
    2
    Par défaut
    Je suis confus, je me suis mal exprimer...

    Je ne cherche pas a avoir un fichier de cette forme:

    1ere ligne fichier1
    1ere ligne fichier2
    2nde ligne fichier1
    2nde ligne fichier2

    mais bien:

    1ere ligne fichier1
    1ere ligne fichier2
    1ere ligne fichier1
    2nde ligne fichier2
    1ere ligne fichier1
    3eme ligne fichier2
    2nde ligne fichier1
    1ère ligne fichier2
    2nde ligne fichier1
    2nde ligne fichier2
    ...
    ...
    derniere ligne fichier1
    derniere ligne fichier2

    D'un point de vu fonctionnel, j'ai un fichier de reference (fichier1) et je veux verifier que les lignes de fichier2 sont bien conformes à fichier1. Je veux relever les lignes altérées (lignes avec meme identifiant mais reste de la chaine different) et mettre de côté les lignes en trop ou manquantes. Sachant que pour faire ce tri, j'ai déja toutes les fonctions requises. C'est pourquoi je cherche juste à mettre à dispositions les couples de lignes dont j'ai besoins.

    Désolé pour le manque de clarté.

    edit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    while(fgets(chaine1, 256, import1) != NULL){
           while(fgets(chaine2, 256, import2)!= NULL){
    		 fputs(chaine1,export1);
    		 fputs(chaine2,export1);
    	}
    }
    Testé à l'instant, j'ai toujours le même problème, j'obtiens:

    1ère ligne fichier1
    1ère ligne fichier2
    1ère ligne fichier1
    2nde ligne fichier2
    ...
    1ère ligne fichier1
    dernière ligne fichier2
    EOF

    Ce que j'ai est bon mais il y a juste les données pour la première ligne de fichier1...le programme passe jamais aux autres.

    edit2:
    J'ai fais un test que j'aurai du faire plus tot. J'ai remplacé la premiere boucle sur le fichier1 par une boucle plus simple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    while(i!=100){
           i++;
           while(fgets(chaine2, 256, import2)!= NULL){
    	 fprintf(export2,"%d",i);
    	 fputs(chaine2,export2);
           }
    }
    Resultat: Aucune amélioration, j'ai la première valeur de i au lieu de la premiere ligne de fichier1... J'ai fais queqlue chose de travers mais j'ai plus le recul pour le voir. 2 longues journées sur ce problème.

  4. #4
    Candidat au Club
    Profil pro
    Inscrit en
    Août 2009
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 3
    Points : 2
    Points
    2
    Par défaut
    Problème résolu, je savais que ça m'aiderait d'en parler

    Pour la réponse si ça peut interesser quelqu'un. A la fin de chaque passage dans le deuxieme fichier, il faut repositionner le curseur au début du fichier pour le prochain passage.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    		while (!feof(import1)){
    			fgets(chaine1, 256, import1);
    			while(!feof(import2){
    				fgets(chaine2, 256, import2);
    				fputs(chaine1,export1);
    				fputs(chaine2,export1);
    			}
                                           fseek(import2,0,SEEK_SET);
    		}

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Parcours de fichiers et condition d'arrêt
    Par DaXou45 dans le forum Langage
    Réponses: 1
    Dernier message: 17/05/2006, 10h32
  2. Lecture et parcours de fichiers binaires
    Par john_osaka dans le forum C++
    Réponses: 1
    Dernier message: 07/03/2006, 20h58
  3. parcour de fichier et retour a la ligne?
    Par xtaze dans le forum VB 6 et antérieur
    Réponses: 9
    Dernier message: 01/11/2005, 22h54
  4. Parcours de fichier
    Par ZzTop dans le forum Linux
    Réponses: 5
    Dernier message: 18/11/2004, 16h47
  5. [LG]Lenteur de parcours de fichier
    Par YéTeeh dans le forum Langage
    Réponses: 9
    Dernier message: 26/11/2003, 22h57

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo