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 Aide [Fichiers textes]
    Bonsoir,

    Cela fait un petit moment que j'essaie de trouver mon erreur dans mon programme que je vais poster ci-dessous :

    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
     
    #include <stdio.h>
    #include <stdlib.h>
     
    int main (int argc, char *argv[])
    {
     
      FILE *cible;
      int rang, i=0, valeur=0, j=0;
     
     
      if (cible=fopen("save_int.txt","r"))
        {
     
            while (fgetc(cible)!=EOF)
    	{
    	  while(fgetc(cible)!='\n');
    	  j++;
    	  }
     
           printf("Entrez le rang de la valeur recherchee : ");
           scanf("%d",&rang);
     
           while (rang>j)
    	 {
    	  printf("Depassement du fichier ! \n Entrez a nouveau le rang : ");
    	  scanf("%d",&rang);
    	  }
     
     
           while (!feof(cible)&&(i<rang))
    	{
     
    	  fscanf(cible,"%d",&valeur);
    	  i++;
     
    	  }
     
    	printf("%d \n",valeur);
    	fclose(cible);
        }  
     
      else printf("Erreur à l'ouverture du fichier ! \n");
     
      return EXIT_SUCCESS;
    }
    En fait j'ai essayé de trouver l'erreur en procédant par petits tests en reprenant chaque bout de code mais je ne comprend pas l'erreur !

    En fait il ne rentre pas dans la boucle suivante : while (!feof(cible)&&(i<rang))
    Il devrait y rentrer et me lire l'entier qui figure sur la première ligne de mon fichier texte ou sont présents plusieurs entiers (un par ligne), et le stocker dans la variable valeur.

    Besoin d'un petit coup de main ...

    Merci,

  2. #2
    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 normal, étant donné que tu fais l'instruction:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
            while (fgetc(cible)!=EOF)
    	{
    	  while(fgetc(cible)!='\n');
    	  j++;
    	  }
    Tu te trouves donc à la fin du fichier ainsi "!feof()" sera toujours faux, tu dois donc te replacer au début, avant de lire tes données
    , en faisant par exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fseek(cible,0,SEEK_SET);
    après ta boucle while

  3. #3
    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 bien ! J'y pensais vraiment pas du tout !

    En revanche je viens de voir en testant que mon compteur de lignes au début répétait deux fois le chiffre 13 alors qu'il devrait compter 14 lignes puisque j'ai 14 chiffres (un par ligne) dans mon fichier texte ouvert ...

    j est initialisé à 0 donc fgetc() lit le premier chiffre et j est incrémenté de un soit j=1 et tac juste après le chiffre il rencontre le \n et on revient à la première condition du premier while() et ainsi de suite ... Je ne vois pas vraiment pourquoi il m'affiche :

    1234567891011121313

    C'est exactement ce qu'il m'affiche quand je demande à afficher j dans la boucle !

  4. #4
    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
    Tu as mis quoi exactement dans ton fichier txt?
    parce que si tu as mis les chiffres de 1 à 13 , ça ne fait que 13 chiffres
    Ou précisément affiches tu la valeur de j?

  5. #5
    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
    Tu as mis quoi exactement dans ton fichier txt?
    parce que si tu as mis les chiffres de 1 à 13 , ça ne fait que 13 chiffres
    Voici ce que contient mon fichier .txt :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    4 
    5 
    7 
    5 
    4 
    7 
    8 
    9 
    5 
    6 
    1 
    4 
    5 
    7

  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
    tu peux donner ton code test?

  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
    tu peux donner ton code test?
    Voici mon code actuel avec le petit affichage pour tester les différentes valeurs de j :

    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
    #include <stdio.h>
    #include <stdlib.h>
     
     
    int main (int argc, char *argv[])
    {
     
      FILE *cible;
      int rang, i=0, valeur, j=0;
     
     
      if (cible=fopen("save_int.txt","r"))
        {
     
            while (fgetc(cible)!=EOF)
    	  {
    	  while(fgetc(cible)!='\n')
    	  j++;
    	  printf("%d",j);
    	  }
     
           printf("Entrez le rang de la valeur recherchee : ");
           scanf("%d",&rang);
     
           while (rang>j)
    	 {
    	  printf("Depassement du fichier ! \n Entrez a nouveau le rang : ");
    	  scanf("%d",&rang);
    	 }
     
     
           fseek(cible,0,SEEK_SET);
     
           while (!feof(cible)&&(i<rang))
     
    	 {
      	  fscanf(cible,"%d",&valeur);
    	  i++;
    	 }
     
    	printf("%d \n",valeur);
    	fclose(cible);
        }  
     
      else printf("Erreur à l'ouverture du fichier ! \n");
     
      return EXIT_SUCCESS;
    }

  8. #8
    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
    Tu utilises mal la fonction feof. Cette fonction ne doit être utilisée que lorsqu'une fonction de lecture de fichier retourne EOF (EOF peut indiquer soit une fin de fichier soit une erreur quelconque), pour s'assurer qu'on a effectivement atteint la fin du fichier et qu'il ne s'agit pas d'autre chose.
    Cette fonction ne fait donc pas ce qu'on croit.

  9. #9
    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 peut-être du au ";" que tu as oublié:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     {
    	  while(fgetc(cible)!='\n');
    	  j++;
    	  printf("%d",j);
    	  }

  10. #10
    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 peut-être du au ";" que tu as oublié:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     {
    	  while(fgetc(cible)!='\n');
    	  j++;
    	  printf("%d",j);
    	  }
    Et bien il n'y a pas de " ; " justement puisque le j++; est une instruction du second while () ... ?

  11. #11
    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
    Non car si tu fais cela "j" va correspondre aux nombres de caracteres compris entre le premier caractere de ta ligne et la fin de celle-ci
    Ici la seule raison pour laquelle ton compteur "j "semble "marcher", c'est parce que tu as mis un espace apres chaque chiffre dans ton fichier texte, à part sur la dernière ligne(D'ou la répétition du 13, qui correspond finalement au nombre d'espaces!)
    Pour compter le nombre de lignes, tu dois d'abord détecter le '\n' puis incrémenter ton compteur de lignes, le "j++" doit donc être en dehors de ton "while".

  12. #12
    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
    Non car si tu fais cela "j" va correspondre aux nombres de caracteres compris entre le premier caractere de ta ligne et la fin de celle-ci
    Ici la seule raison pour laquelle ton compteur "j "semble "marcher", c'est parce que tu as mis un espace apres chaque chiffre dans ton fichier texte, à part sur la dernière ligne(D'ou la répétition du 13, qui correspond finalement au nombre d'espaces!)
    Pour compter le nombre de lignes, tu dois d'abord détecter le '\n' puis incrémenter ton compteur de lignes, le "j++" doit donc être en dehors de ton "while".
    Merci pour ta remarque qui s'avère juste ! Effectivement, je ne comprenais pas bien pourquoi cela ne fonctionnait pas ! Il y avait un espace avant le \n et après le nombre en question de placé dans le fprintf() d'un autre petit programme que j'avais fais qui permettait de remplir justement un fichier texte avec des entiers. Je l'ai donc enlevé et ça fonctionne bien !

    Cependant j'avoue avoir un peu de mal à suivre la trace d'exécution pour bien comprendre l'erreur que j'avais faite !

    Puisqu'il y avait avant un entier_unespace_leretourchariot
    Donc ce que j'avais fais tant que fgetc()!= '\n' il devait incrémenter j d'un hors avec l'espace ça aurait du faire deux pour la première ligne à moins que fgetc() ne prenne pas en compte les espaces ...

    Et dans ce cas là je ne vois pas trop pourquoi ça ne fonctionnait pas puisqu'il lit le nombre et incrémente j de un puisqu'après il rencontre le \n et de même pour les lignes suivantes ...

    Si tu peux m'éclairer un peu, ce serait bien !

  13. #13
    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
    en reprenant ton code:
    while (fgetc(cible)!=EOF)/*boucle 1*/
    {
    while(fgetc(cible)!='\n')/*boucle 2*/
    j++;
    printf("%d",j);
    }
    la première fois que la condition de la boucle 1 est testée un fgetc est réalisé, le chiffre 4 est donc pris-> pas fin du fichier,on rentre dans cette boucle.
    Ensuite la vérification de la condition de la boucle 2 est testée un fgetc est réalisé, l'espace est pris ->ce n'est pas un '\n' -> on rentre dans la boucle ->on incrémente j.
    On revient au début de la boucle 2 on fait un fgetc pour tester la condition, on prend un '\n' -> on exécute pas le corps de la boucle, on passe donc au printf().
    On revient alors au début de la boucle 1, on fait un fgetc, le chiffre 5 est alors pris et tout se passe comme précédemment....

    En revanche a la dernière ligne, il y a une différence:
    le fgetc de la première boucle prend bien le 7, en revanche le caractere qui se trouve après le 7 est cette fois ci un '\n' la condition de la boucle 2 n'est donc pas réalisé (puisque le fgetc prend un '\n')-> on n'incrémente pas j -> on passe a printf() qui imprime la valeur de j qui est la même qu'a a ligne précédente(car pas incrémenté)

  14. #14
    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
    en reprenant ton code:

    la première fois que la condition de la boucle 1 est testée un fgetc est réalisé, le chiffre 4 est donc pris-> pas fin du fichier,on rentre dans cette boucle.
    Ensuite la vérification de la condition de la boucle 2 est testée un fgetc est réalisé, l'espace est pris ->ce n'est pas un '\n' -> on rentre dans la boucle ->on incrémente j.
    On revient au début de la boucle 2 on fait un fgetc pour tester la condition, on prend un '\n' -> on exécute pas le corps de la boucle, on passe donc au printf().
    On revient alors au début de la boucle 1, on fait un fgetc, le chiffre 5 est alors pris et tout se passe comme précédemment....

    En revanche a la dernière ligne, il y a une différence:
    le fgetc de la première boucle prend bien le 7, en revanche le caractere qui se trouve après le 7 est cette fois ci un '\n' la condition de la boucle 2 n'est donc pas réalisé (puisque le fgetc prend un '\n')-> on n'incrémente pas j -> on passe a printf() qui imprime la valeur de j qui est la même qu'a a ligne précédente(car pas incrémenté)
    Hum, merci ! Je vois mieux, j'oubliais mon premier fgetc() dans la première boucle et le fait qu'il prenait un caractère ...

    Je sais pas si c'est mieux de fermer ce post ou de le laisser ouvert pour l'instant si je rencontre d'autres soucis avec les fichiers texte ...
    De toute manière ça pourra aider surement d'autres personnes !

  15. #15
    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
    Hum ! Je suis devant un nouveau problème !

    J'essaie de faire un petit programme qui ouvre sur sa sortie standard le contenu d'un fichier texte passé en argument sur la ligne de commande et qui numérote ses lignes également !

    Pour numéroter les lignes j'ai le même concept que précédemment, seulement pour lire le contenu il m'affiche juste quelques caractères et des caractères spéciaux ...

    Pourtant pour lire le contenu d'un fichier texte il faut bien faire un fgetc() tant qu'on n'est pas en fin de fichier ?!

    Et par rapport aux lignes je peux afficher le numéro mais en fin de ligne, enfin ça c'est pas vraiment un problème mais pour afficher en début je vois pas ...

    J'ai finalement trouver comment faire !

  16. #16
    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'ai actuellement un petit soucis dans un programme ou je simule le fonctionnement de la commande cp !

    En fait quand on précise en précisant une option sur la ligne de commande on peut avoir le choix d'ajouter en fin du fichier de destination le contenu du fichier source !

    Seulement mon soucis c'est en utilisant fseek(dest,0,SEEK_END) :

    J'interroge la position du curseur dans le fichier dest avec la fonction ftell() et elle me renvoie 0 alors que la position devrait être en fin de fichier.

    J'ai par ailleurs remarquer qu'après avoir taper du texte dans un fichier .txt pour avoir un fichier de test et après l'avoir sauvegarder en le réouvrant il est vide .. ce qui expliquerait la position 0 mais je ne comprend pas bien pourquoi ça me fait ça ... chose qui n'a à priori rien à voir avec mon programme ...

    En fait si à priori c'est au lancement du programme avec l'option a il efface le contenu qu'il y avait dans le fichier de destination ...

    Merci de m'éclairer un peu.

  17. #17
    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
    Il faut savoir que si tu ouvres ton fichier en c avec "w" ou "w+",le contenu du fichier est intégralement effacé!
    (Si ce n'est pas ça ton problème, soit plus précis sur la manière dont ton programme devait rajouter des choses)

  18. #18
    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
    Il faut savoir que si tu ouvres ton fichier en c avec "w" ou "w+",le contenu du fichier est intégralement effacé!
    (Si ce n'est pas ça ton problème, soit plus précis sur la manière dont ton programme devait rajouter des choses)
    Ah ! C'est surement ça alors ... il doit y avoir un autre mode alternatif pour pouvoir écrire à la suite ...

    Je sais pas comment j'ai fais pour ne pas y penser ! Je vais tester ...

  19. #19
    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
    Si tu veux écrire et lire sans effacer le contenu du fichier, il y a "r+". Si tu veux écrire directement à la fin d'un fichier(curseur positionné en fin de fichier), il y a "a"et si tu veux en plus pouvoir lire il y a "a+"

  20. #20
    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
    Si tu veux écrire et lire sans effacer le contenu du fichier, il y a "r+". Si tu veux écrire directement à la fin d'un fichier(curseur positionné en fin de fichier), il y a "a"et si tu veux en plus pouvoir lire il y a "a+"
    Ouais, j'ai trouvé ! Merci de la remarque bien que ce ne soit pas forcément très poussé comme erreur !

    Au moins j'ai trouvé mon erreur !

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: 01/04/2008, 23h27
  2. Réponses: 0
    Dernier message: 25/02/2008, 14h23
  3. [AIDE] modification d'un fichier texte
    Par babap1 dans le forum C++
    Réponses: 6
    Dernier message: 16/01/2008, 11h49
  4. [C++] Menu d'aide: ouvrir un fichier texte
    Par debutanteVB.NET dans le forum C++
    Réponses: 11
    Dernier message: 15/12/2005, 23h12

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