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 :

Aide [Fichiers textes]


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 29
    Par défaut
    J'essaie de faire un programme qui prend deux listes d'entiers chacunes triées dans l'ordre croissant et de les écrire dans un fichier destination toujours triées dans l'ordre croissant !

    Seulement premier problème rencontré :

    1) En fait je parcours chaque fichier jusqu'à la fin et je copie leur contenu dans un tableau (un pour chaque liste).

    Et il m'écrit deux fois la même chaîne dans le fichier destination !

    Ex :

    liste1 : 124689
    liste2 : 357

    des: 124689
    124689
    357
    357

    Voici le code :

    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
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
     
    #include <stdlib.h>
    #include <stdio.h>
     
    #define TAILLE_MAX 100
     
    int main (int argc, char *argv[])
    {
     
      FILE *int_list1, *int_list2, *dest;
      char buffer1[TAILLE_MAX]="", buffer2[TAILLE_MAX]="";
      int tableau_tri[TAILLE_MAX];
     
     
      if (int_list1=fopen("liste_int_1.txt","r"))
        {
          if (int_list2=fopen("liste_int_2.txt","r"))
    	{
    	  if (dest=fopen("fusion_liste.txt","w"))
    	    {
    	      while (!feof(int_list1))
    		{
    		  fgets(buffer1,TAILLE_MAX,int_list1);
    		  fprintf(dest,"%s",buffer1);
    		}
     
     
    	        while (!feof(int_list2))
    		{
    		  fgets(buffer2,TAILLE_MAX,int_list2);
    		  fprintf(dest,"%s",buffer2);
    		}
     
     
    		    fclose(dest);
    	    }
     
    	  else printf("Erreur a l'ouverture du fichier [dest] ! \n");
     
    	    fclose(int_list2);
    	}
     
          else printf("Erreur a l'ouverture du fichier [int_list2] ! \n");
     
          fclose(int_list1);
        }
     
      else printf("Erreur a l'ouverture du fichier [int_list1] ! \n");
     
      return EXIT_SUCCESS;
    }

  2. #2
    Membre Expert
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 104
    Par défaut
    Encore cet affreux feof...

  3. #3
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 514
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 514

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 29
    Par défaut
    Je comprend pas pourquoi fgetc indique la constante -1 de EOF alors que je suis en début de fichier !

    Effectivement ainsi il ne peut entrer dans la boucle ..
    Mon but actuel étant juste de compter les entiers dans le fichier de destination pour savoir combien il y en a et par la suite commencer le tri à bulle dans le tableau d'int !

    Mais je crois bien que l'utilisation de fgetc() ici n'est pas vraiment appropriée pour avoir des entiers mais le problème reste le même ... fscanf() serait plus judicieux comme choix je pense !

    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
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
     
    #include <stdlib.h>
    #include <stdio.h>
     
    #define TAILLE_MAX 100
     
    int main (int argc, char *argv[])
    {
     
      FILE *int_list1, *int_list2, *dest;
      char buffer1[TAILLE_MAX] = "", buffer2[TAILLE_MAX] = "";
      int tableau_tri[TAILLE_MAX], i = 0;
     
      if (int_list1 = fopen("liste_int_1.txt", "r"))
        {
          if (int_list2 = fopen("liste_int_2.txt", "r"))
    	{
    	  if (dest = fopen("fusion_liste.txt", "w"))
    	    {
    	      while (fgets(buffer1, TAILLE_MAX, int_list1) != NULL)
    	      	fprintf(dest, "%s", buffer1);
     
     
    	      while ((fgets(buffer2, TAILLE_MAX, int_list2) != NULL))
    		fprintf(dest, "%s", buffer2);
     
    	      rewind(dest);
     
     
    	        while(fgetc(dest) != EOF)
    		{
    		  tableau_tri[i] = fgetc(dest);
    		  i++;
    		  }
     
    		  printf("%d \n",i);
     
     
    	      fclose(dest);
    	    }
     
    	  else printf("Erreur a l'ouverture du fichier [dest] ! \n");
     
    	    fclose(int_list2);
    	}
     
          else printf("Erreur a l'ouverture du fichier [int_list2] ! \n");
     
          fclose(int_list1);
        }
     
      else printf("Erreur a l'ouverture du fichier [int_list1] ! \n");
     
      return EXIT_SUCCESS;
    }

  5. #5
    Membre Expert
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 104
    Par défaut
    Je comprend pas pourquoi fgetc indique la constante -1 de EOF alors que je suis en début de fichier !
    Ton fichier "dest" est ouvert en écriture, pas en lecture. Or, fgetc est une fonction de lecture.

  6. #6
    Membre expérimenté Avatar de quetzacoatl
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    168
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 168
    Par défaut
    C'est parfaitement normal, tu incrémente ton compteur, après avoir rempli une case du tableau, donc tu te positionne à la case suivante après avoir rempli une case, quand tu arrives à la fin de ton fichier, i=8 le scanf ne détecte pas la fin du fichier, i est incrémenté=>i=9, le scanf détecte alors la fin de fichier => la boucle s'arrête
    Pour ta condition:
    while(fscanf(dest,"%d",&tableau_tri[i]) != EOF)
    C'est un peu dangereux, si ton fichier se finit par un espace ou un '\n', fscanf ne te renverra pas EOF, il faudrait donc mieux mettre d'après moi:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    while(fscanf(dest,"%d",&tableau_tri[i]) == 1)

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 29
    Par défaut
    Citation Envoyé par quetzacoatl Voir le message
    C'est parfaitement normal, tu incrémente ton compteur, après avoir rempli une case du tableau, donc tu te positionne à la case suivante après avoir rempli une case, quand tu arrives à la fin de ton fichier, i=8 le scanf ne détecte pas la fin du fichier, i est incrémenté=>i=9, le scanf détecte alors la fin de fichier => la boucle s'arrête
    Pour ta condition:

    C'est un peu dangereux, si ton fichier se finit par un espace ou un '\n', fscanf ne te renverra pas EOF, il faudrait donc mieux mettre d'après moi:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    while(fscanf(dest,"%d",&tableau_tri[i]) == 1)
    Mais justement comme j'ai précisé le format %d pour lire uniquement des entiers ça ne devrait lire que des entiers ?

    Ou bien alors si j'ai compris il lit quand même ce qu'il y a après les entiers et c'est le codage des caractères ?

    Parce que pour ne pas s'arrêter c'est qu'il lit quelque chose qu'il peut interpréter comme un entier ?

    Et pour le EOF tu dis que si le fichier finit par un \n ou un espace sa valeur ne sera pas renvoyée mais je ne savais pas cela, pourquoi en fait ?

    Je te remercie bien.

  8. #8
    Membre expérimenté Avatar de quetzacoatl
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    168
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 168
    Par défaut
    Voici le passage correspondant du man de la fonction scanf(et affiliées):

    "Ces fonctions renvoient le nombre d'éléments d'entrées correctement assignés. Ce nombre peut être plus petit que le nombre d'élements attendus, et même être nul, s'il y a une erreur de mise en correspondance. La valeur zéro indique qu'aucune conversion n'a été faite bien que des caractères étaient disponibles en entrée. Typiquement c'est un caractère d'entrée invalide qui en est la cause, par exemple un caractère alphabétique dans une conversion `%d'. La valeur EOF est renvoyée si une erreur d'entrée a eu lieu avant toute conversion, par exemple une fin de fichier. Si une erreur fin-de-fichier se produit après que les conversions aient commencé, le nombre de conversions réussies sera renvoyé."

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 29
    Par défaut
    Citation Envoyé par quetzacoatl Voir le message
    Voici le passage correspondant du man de la fonction scanf(et affiliées):

    "Ces fonctions renvoient le nombre d'éléments d'entrées correctement assignés. Ce nombre peut être plus petit que le nombre d'élements attendus, et même être nul, s'il y a une erreur de mise en correspondance. La valeur zéro indique qu'aucune conversion n'a été faite bien que des caractères étaient disponibles en entrée. Typiquement c'est un caractère d'entrée invalide qui en est la cause, par exemple un caractère alphabétique dans une conversion `%d'. La valeur EOF est renvoyée si une erreur d'entrée a eu lieu avant toute conversion, par exemple une fin de fichier. Si une erreur fin-de-fichier se produit après que les conversions aient commencé, le nombre de conversions réussies sera renvoyé."
    Ah en français ça change ! Bien oui d'accord EOF n'est pas adapté alors mais pourquoi tu parlais de " 1 " dans la condition ?

    Et le rapport avec le \n et l'espace ?

    Merci,

  10. #10
    Membre Expert
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 104
    Par défaut
    mais pourquoi tu parlais de " 1 " dans la condition ?
    La réponse se trouve dans la première ligne de :
    Ces fonctions renvoient le nombre d'éléments d'entrées correctement assignés. Ce nombre peut être plus petit que le nombre d'élements attendus, et même être nul, s'il y a une erreur de mise en correspondance. La valeur zéro indique qu'aucune conversion n'a été faite bien que des caractères étaient disponibles en entrée. Typiquement c'est un caractère d'entrée invalide qui en est la cause, par exemple un caractère alphabétique dans une conversion `%d'. La valeur EOF est renvoyée si une erreur d'entrée a eu lieu avant toute conversion, par exemple une fin de fichier. Si une erreur fin-de-fichier se produit après que les conversions aient commencé, le nombre de conversions réussies sera renvoyé.

    Si j'ai bien compris le fichier texte contient un nombre par ligne. Si fscanf affecte bien la valeur lue depuis le fichier à l'objet, elle renvoie donc 1, puisque la chaine de format ne contient qu'un %.
    Pour bien comprendre cette fonction (qui est quand même bien compliquée), je te propose de lire : http://xrenault.developpez.com/tutoriels/c/scanf/

    A ta place (ça n'engage que moi), j'aurais opté pour une solution à base de fgets et strtol. Simple, efficace, sans se soucier de choses casse-tête. Comme il suffit de lire un nombre par ligne, ça roule.

  11. #11
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 29
    Par défaut
    Merci pour les derniers message ! Cela m'a aidé !

    Dites je suis sur un autre type de programme ! Là actuellement j'essaie de compter les mots et caractères d'échappement type isspace() dans une chaîne et je bloque un peu déjà ...

    Si vous pouviez m'éclaircir le chemin sur l'algorithmie quoi !

    On parcourt la chaîne jusqu'à n-1 avec un compteur puis on affecte chaque case du tableau de char à une variable c par exemple et si isspace != 0 alors on a lu un caractère on peut incrémenter le compteur de caractères et donc comme on a lu un caractère on a lu aussi un mot donc on peut incrémenter le compteur de mots ?

    Merci,

Discussions similaires

  1. [HTML] Générer un fichier texte à l'aide d'une interface graphique en HTML
    Par gogeta68 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 2
    Dernier message: 02/04/2008, 00h27
  2. Réponses: 0
    Dernier message: 25/02/2008, 15h23
  3. [AIDE] modification d'un fichier texte
    Par babap1 dans le forum C++
    Réponses: 6
    Dernier message: 16/01/2008, 12h49
  4. [C++] Menu d'aide: ouvrir un fichier texte
    Par debutanteVB.NET dans le forum C++
    Réponses: 11
    Dernier message: 16/12/2005, 00h12

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