Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
644 connectés 

  FORUM HardWare.fr
  Programmation
  C

  aide recuperation donnees d'un fichier texte

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

aide recuperation donnees d'un fichier texte

n°1556037
Anarchne
Posté le 06-05-2007 à 16:43:51  profilanswer
 

Salut, j'ai un petit problème concernant mon programme de recuperation de donnees:
il doit récupérer une donnée chaine de caractère et deux données entier:
 
int main()
{
     
    char tampon[30];
    int x;
    int y;
    char c;
    FILE *fic;
     
     
    fic=fopen("fichier.txt","r" );
     
    while(EOF != (c = fgetc(fic)))
        {
     
                     if ('\n' != c )
                     {
                     fscanf(fic,"%s %d %d",tampon,&x,&y);
     
                     printf("%s %d %d\n",tampon,x,y);
                     }
        }
     
    system("pause" );
     
    return 0;
}
 
 
mon seul problème est qu'il ne récupère pas le premier caractère de ma chaine de texte (se doit être à cause de mon test si la ligne est vide ou non).
exemple
 
voici mon fichier.txt:
 
 
 
poisson 1 5
 
 
chat 24 10
 
 
chien 78 5
 
 
le programme m'affiche:
 
oisson 1 5
hat 24 10
hien 78 5
 
 
je ne sais pas du tout comment résoudre cela.
Merci de votre aide.
 
 
 
 
 

mood
Publicité
Posté le 06-05-2007 à 16:43:51  profilanswer
 

n°1556061
Trap D
Posté le 06-05-2007 à 18:22:05  profilanswer
 

int c; et non pas char c d'abord.
Ensuite tu as tout à fait raison, c'est à cause de fgetc.

n°1556070
Anarchne
Posté le 06-05-2007 à 18:51:15  profilanswer
 

mais sa marche avec char c !!!!
j'ai testé. Je comprend pas.
 
Sinon ok donc c'est bien à cause de sa.
Comment contourner le problème alors??

n°1556269
Emmanuel D​elahaye
C is a sharp tool
Posté le 07-05-2007 à 01:41:40  profilanswer
 

Anarchne a écrit :

mais sa marche avec char c !!!!


Si tu veux lire avec fgetc(), c doit être de type int parce que EOF est un int < 0. Avec char, ça fonctionne par hasard. Si il y a un code 255 dans le fichier(ÿ ou un truc comme ça), il est interprété comme une fin de fichier, ce qui n'est probablement pas ce que tu veux.

Citation :

Sinon ok donc c'est bien à cause de sa.
Comment contourner le problème alors??


Ensuite, pourquoi utiliser fgetc() + fscanf() ? fgetc() lit un caractère. Il est donc normal qu'il en manque un quand tu lis avec fscanf(), puis qu'il a déjà été lu...
 
Il faut donc faite les choses simplement selon les règles :  
 
lire la ligne avec fgets(), puis l'analyser avec sscanf().
 
en cas de fin de lecture, fgets() retourne NULL.

Code :
  1. char line[BIG_ENOUGH];
  2.    while (fgets (line, sizeof line, fp) != NULL)
  3.    {
  4.       /* traiter la ligne (sscanf(), par exemple...) */
  5.    }


 


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
n°1556477
Anarchne
Posté le 07-05-2007 à 14:19:15  profilanswer
 

Ok ok merci beaucoup je vais faire comme sa.
Merci de m'avoir aidé.

n°1557791
Anarchne
Posté le 10-05-2007 à 10:11:37  profilanswer
 

OK merci sa marche sauf le test si la ligne est vide ou non.
je fais
 while (fgets(tampon,30,fic) != NULL)
{
              if (tampon != '\n')
              {
                     sscanf(tampon,%d %s %s ....
               }
 
}
 
 
mais il ne veut pas faire le test de ligne.
 
 
 

n°1557807
Emmanuel D​elahaye
C is a sharp tool
Posté le 10-05-2007 à 10:37:54  profilanswer
 

Anarchne a écrit :


Code :
  1. while (fgets(tampon,30,fic) != NULL)
  2. {
  3.               if (tampon != '\n')

mais il ne veut pas faire le test de ligne.


Oui, c'est sûr. Tu compares l'adresse d'une chaine avec un caractère, tu espères quoi au juste :

Code :
  1. if (tampon[0] != '\n')


Il faut un minimum de bon sens et de cohérence, non ?

 

Pourquoi tu mets 30 et pas sizeof tampon ? J'ai pas dit que c'était faux, mais je veux juste savoir si il y a une bonne raison.


Message édité par Emmanuel Delahaye le 10-05-2007 à 10:38:58

---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
n°1559104
Anarchne
Posté le 11-05-2007 à 18:23:32  profilanswer
 

Euh non en fait.
Mais tampon fait 30 donc...

n°1559107
Anarchne
Posté le 11-05-2007 à 18:26:29  profilanswer
 

Ok j'ai compris c'est bon.
 
if ((*tampon) != '\n')  
              {  
                     sscanf(tampon,%d %s %s ....  
               }  
 
 
et là sa marche.

n°1559114
Emmanuel D​elahaye
C is a sharp tool
Posté le 11-05-2007 à 18:35:55  profilanswer
 

Anarchne a écrit :

Ok j'ai compris c'est bon.

Code :
  1. if ((*tampon) != '\n')
  2. <...>


et là sa marche.


Oui, enfin, la différence entre *tampon et tampon[0] est ... faible !


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
mood
Publicité
Posté le 11-05-2007 à 18:35:55  profilanswer
 

n°1559135
Anarchne
Posté le 11-05-2007 à 19:18:32  profilanswer
 

J'ai une autre question, basé sur ce principe, j'aimerais faire une fonction de comptage de lignes non vides.
Le probème est que le programme me renvoie toujours 0.
Voici le programme:
 
int nb_lignes(FILE *fic)
{
    int n=0;
    char tampon[50];
    while(fgets(tampon,sizeof(tampon),fic) != NULL)
    {
     
                     if ((*tampon) != '\n')
                     {
                                   n++;
                     }
           
     }
     
    return n;
}
 
Cela devrait marcher non?

n°1559147
Emmanuel D​elahaye
C is a sharp tool
Posté le 11-05-2007 à 19:39:50  profilanswer
 

Anarchne a écrit :

J'ai une autre question, basé sur ce principe, j'aimerais faire une fonction de comptage de lignes non vides.
Le probème est que le programme me renvoie toujours 0.
Voici le programme:
 
int nb_lignes(FILE *fic)
{
    int n=0;
    char tampon[50];
    while(fgets(tampon,sizeof(tampon),fic) != NULL)
    {
     
                     if ((*tampon) != '\n')
                     {
                                   n++;
                     }
           
     }
     
    return n;
}
 
Cela devrait marcher non?


Ca devrait. Je vérifie...
 
C'est OK :  

Code :
  1. #include <stdio.h>
  2. int nb_lignes (FILE * fic)
  3. {
  4.    int n = 0;
  5.    char tampon[50];
  6.    while (fgets (tampon, sizeof (tampon), fic) != NULL)
  7.    {
  8.       if ((*tampon) != '\n')
  9.       {
  10.          n++;
  11.       }
  12.    }
  13.    return n;
  14. }
  15. int main (void)
  16. {
  17.    FILE *fp = fopen ("main.c", "r" );
  18.    if (fp != NULL)
  19.    {
  20.       int n = nb_lignes (fp);
  21.       char const *s = n > 1 ? "s" : "";
  22.       printf ("%d ligne%s non vide%s\n", n, s, s);
  23.       fclose (fp);
  24.    }
  25.    return 0;
  26. }



28 lignes non vides
 
Press ENTER to continue.


Je soupçonne que tu ais déjà atteint la fin de fichier. Il manquerait un rewind() avant d'appeler la fonction de comptage...


Message édité par Emmanuel Delahaye le 11-05-2007 à 19:46:43

---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
n°1559168
Anarchne
Posté le 11-05-2007 à 20:48:23  profilanswer
 

rewind je n'ai pas vu cette commande en tp elle fait quoi exactement?
 
Et qu'est-ce que tu entends par j'ai atteint la fin de fichier???

n°1559193
Emmanuel D​elahaye
C is a sharp tool
Posté le 11-05-2007 à 21:43:32  profilanswer
 

Anarchne a écrit :

rewind je n'ai pas vu cette commande en tp elle fait quoi exactement?

 

Et qu'est-ce que tu entends par j'ai atteint la fin de fichier???


Ouvre ton livre de C. Tout ceci est basique...

 

K&R2 : Chapitre 7

 

P.S. Il n'y a pas de 'commandes' en C. Uniquement des instructions et des appels de fonction.

 


Message édité par Emmanuel Delahaye le 11-05-2007 à 21:44:18

---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
n°1565250
Biroute
j'aime les andouillettes !:op
Posté le 25-05-2007 à 15:52:51  profilanswer
 

salut, ben moi je suis aussi en galère pour récupérer des données ^^
 
alors en gros, j'ai un fichier asci comprenant une ligne de paramètre puis un tableau d'une 40aine de colonne pour environ 17 000 lignes.
 
pour le moment, je compte uniquement faire une espèce de copié/collé du fichier que j'essayerais de complexifier ensuite. A terme, il faudra que je crée 3 fichiers (appelons les x, y et z) à partir du premier en récupérant dans chacun la ligne de paramètre puis pour le fichier x les colonnes n, n+3, n+6 etc, pour le fichier y les colonnes n+1, n+4, n+7 etc, et vous avez compris pour le fichier z ^^
 
j'y connais rien en C alors pour faire ce copié collé, j'ai simplifier pour le moment les données avec un fichier contenant le tableau suivant (les espaces sont des tabulations):
 
1    a    2
b    3    c
 

Code :
  1. #include <stdio.h>
  2. main()
  3. {
  4.   FILE *P_FICHIER1, *P_FICHIER2;   
  5.   char NOM_FICHIER[30];
  6.   char DONNEE[30];
  7.  
  8.        /* Lire le contenu du fichier */
  9.   do
  10.     {
  11.      printf("file name : " );
  12.      scanf("%s", NOM_FICHIER);
  13.      P_FICHIER1 = fopen(NOM_FICHIER, "r" );
  14.      if (!P_FICHIER1)
  15.         printf("\aERROR: Impossible to open file: %s.\n", NOM_FICHIER);
  16.     }
  17.   while (!P_FICHIER1);
  18.      
  19.         /* Créer le fichier de destination */
  20.   printf("create data file: " );
  21.   scanf("%s", NOM_FICHIER);
  22.   P_FICHIER2 = fopen(NOM_FICHIER, "w" );
  23.  
  24.         /* scanner les données du fichier 1 et les écrire dans le fichier 2 */
  25. /* le problème se situe ici, je pense qu'il faut que j'utilise deux boucles for pour les x et y du tableau mais je ne sais pas comment faire */
  26.  
  27.   while (!feof(P_FICHIER1))
  28.      {
  29.       fscanf(P_FICHIER1, "%s\n", DONNEE);
  30.       fprintf(P_FICHIER2,"%s\n", DONNEE);
  31.      }
  32.  
  33.  
  34.      /* Fermeture des fichiers */
  35.   fclose(P_FICHIER1);
  36.   fclose(P_FICHIER2);
  37.      /* petit artefact pour garder la fenètre ouverte */           
  38.   getchar();  getchar();
  39.   return 0;
  40. }


 
avec ce programme, mon fichier de sortie récupère tout, mais il met tout ça sur une seule colonne:
 
1
a
2
b
3
c
 
 
Ma question est: comment dois je faire pour repositionner les données dans le bonne ordre?
 
merci d'avance


---------------
Ma vie en Polonie: http://ketchupnchantilly.blogspot.com/
n°1565260
Emmanuel D​elahaye
C is a sharp tool
Posté le 25-05-2007 à 16:01:04  profilanswer
 

[Pirater le topic d'un autre, çaÿ mal...]

Biroute a écrit :

j'y connais rien en C alors pour faire ce copié collé, j'ai simplifier pour le moment les données avec un fichier contenant le tableau suivant (les espaces sont des tabulations):
 
1    a    2
b    3    c
 
avec ce programme, mon fichier de sortie récupère tout, mais il met tout ça sur une seule colonne:
 
1
a
2
b
3
c
 
 
Ma question est: comment dois je faire pour repositionner les données dans le bonne ordre?
 
merci d'avance


Elles sont dans le bon ordre. Simplement, il y a des \n en trop dans l'affichage qui font que les données ne sont pas présentées pareil.
 
afficher une ligne :

Code :
  1. printf (" %d", data);


autant de fois qi'il y a d'éléments dans la ligne.
 
Quand la ligne est terminée :  

Code :
  1. printf ("\n" );


simple algorithme basique...


Message édité par Emmanuel Delahaye le 25-05-2007 à 16:02:02

---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
n°1565266
Biroute
j'aime les andouillettes !:op
Posté le 25-05-2007 à 16:08:24  profilanswer
 

[je squatte parceque je pense que c'est pas loin d'être le même problème que le mien]
oui mais justement, je ne veux pas copier une ligne, je veux copier les éléments séparemment et pouvoir les réordonner ensuite sous forme de tableau. A terme, sur le tableau

 

1    a    2
b    3    c

 

je voudrais par exemple récupérer les données de la 1ere colonne et de la dernière pour obtenir le tableau

 

1    2
b    c

 

ou n'importe quelle autre distribution.

 

edit: en fait, je suppose que je ne connais pas la taille du tableau, c'est pour ça que je cherche quelque chose en rapport avec les tabulations pour détecter la fin de la ligne par exemple

Message cité 1 fois
Message édité par Biroute le 25-05-2007 à 16:18:15

---------------
Ma vie en Polonie: http://ketchupnchantilly.blogspot.com/
n°1565276
Emmanuel D​elahaye
C is a sharp tool
Posté le 25-05-2007 à 16:18:33  profilanswer
 

Biroute a écrit :

[je squatte parceque je pense que c'est pas loin d'être le même problème que le mien]


Ben non. Erreur. Nouvelle question, nouveau sujet. C'est aussi simple que ça. Tu devrais relire les règles du forum...

 
Citation :

oui mais justement, je ne veux pas copier une ligne, je veux copier les éléments séparemment et pouvoir les réordonner ensuite sous forme de tableau. A terme, sur le tableau

 

1    a    2
b    3    c

 

je voudrais par exemple récupérer les données de la 1ere colonne et de la dernière pour obtenir le tableau

 

1    2
b    c

 

ou n'importe quelle autre distribution.

 



Bah, il faut écrire le bon algo, c'est tout. C'est de la programmation de base. Si tu ne sais pas programmer, apprends ou fait autre chose...


Message édité par Emmanuel Delahaye le 25-05-2007 à 16:18:52

---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
n°1565279
Biroute
j'aime les andouillettes !:op
Posté le 25-05-2007 à 16:22:06  profilanswer
 

ok, merci quand même. (j'ai commencé à apprendre la semaine dernière, c'est pour mon stage, donc j'apprends tout seul)


---------------
Ma vie en Polonie: http://ketchupnchantilly.blogspot.com/
n°1565282
Emmanuel D​elahaye
C is a sharp tool
Posté le 25-05-2007 à 16:28:33  profilanswer
 

Biroute a écrit :

ok, merci quand même. (j'ai commencé à apprendre la semaine dernière, c'est pour mon stage, donc j'apprends tout seul)


Gné ? Tu apprends le C à l'arrache pour un stage ?
 
http://delahaye.emmanuel.free.fr/images/c_warn.png


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
n°1565287
Biroute
j'aime les andouillettes !:op
Posté le 25-05-2007 à 16:32:28  profilanswer
 

oui, je compte pas faire un truc immense avec, juste trier des données. ensuite bon, je suis un physicien dans un labo de géologie, d'où mon inexpérience dans le domaine ^^


---------------
Ma vie en Polonie: http://ketchupnchantilly.blogspot.com/
n°1565295
Emmanuel D​elahaye
C is a sharp tool
Posté le 25-05-2007 à 16:43:07  profilanswer
 

Biroute a écrit :

oui, je compte pas faire un truc immense avec, juste trier des données. ensuite bon, je suis un physicien dans un labo de géologie, d'où mon inexpérience dans le domaine ^^


Comme je te l'ai dit, le C n'est pas un langage de débutant en programmation. Trop de pièges, trop laxiste (il demande une extrême rigueur et un haut niveau de maitrise de la part du programmeur pour réaliser un programme industriel sûr et fiable). Et ça n'a rien à voir avec la taille. En une ligne, on peut exploser le système.

 


Est-tu obligé de faire ça en C ?

 

As-tu envisagé Python ?

Message cité 1 fois
Message édité par Emmanuel Delahaye le 25-05-2007 à 16:44:02

---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
n°1565300
Biroute
j'aime les andouillettes !:op
Posté le 25-05-2007 à 16:49:15  profilanswer
 

je ne connais pas du tout python, et je le fais en C car je connais un peu de visual basic et bon, c pour ça que j'ai déjà compris quelques trucs en une semaine.
c'est quoi python?


---------------
Ma vie en Polonie: http://ketchupnchantilly.blogspot.com/
n°1565348
Emmanuel D​elahaye
C is a sharp tool
Posté le 25-05-2007 à 17:36:11  profilanswer
 

Biroute a écrit :

je ne connais pas du tout python, et je le fais en C car je connais un peu de visual basic et bon, c pour ça que j'ai déjà compris quelques trucs en une semaine.
c'est quoi python?


Un langage plus accessible que le C. Mais si connais VB, pourquoi ne pas le faire en VB ?
 


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
n°1565356
Biroute
j'aime les andouillettes !:op
Posté le 25-05-2007 à 17:41:11  profilanswer
 

parceque je trouve beaucoup plus d'information sur le C que sur le VB, et puis je suis pas non plus une lumière en VB, j'ai appris en stage ça aussi


---------------
Ma vie en Polonie: http://ketchupnchantilly.blogspot.com/
n°1565411
Emmanuel D​elahaye
C is a sharp tool
Posté le 25-05-2007 à 18:42:04  profilanswer
 

Biroute a écrit :

parceque je trouve beaucoup plus d'information sur le C que sur le VB, et puis je suis pas non plus une lumière en VB, j'ai appris en stage ça aussi


Alors va pour le C. Tu as un livre, un tutoriel, des cours ?
 


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
n°1565431
Sve@r
Posté le 25-05-2007 à 19:15:20  profilanswer
 

Anarchne a écrit :

rewind je n'ai pas vu cette commande en tp elle fait quoi exactement?


=> man rewind
 

Anarchne a écrit :

Et qu'est-ce que tu entends par j'ai atteint la fin de fichier???


Faut essayer d'imaginer un fichier comme un ruban contenant des octets, et ton "FILE *" comme un index sur le fichier.
Chaque fonction de lecture (fgetc, fgets, fscanf, fread) lit le ou les caractères situé sous l'index puis fait avancer l'index d'autant.
Donc deux fgetc d'affilée te lisent 2 octets et ton index est sur le 3°.
Une fois que t'as lu tout le fichier, l'index est à la fin et tu peux plus le lire.  
 
Solutions:

  • fermer puis réouvrir le fichier
  • utiliser des fonctions de positionnement de l'index (fseek et/ou rewind aidés d'un peu de ftell)


Par exemple, aujourd'hui j'ai fait une fonction qui va chercher une info particulière dans un fichier. Ma fonction devant rendre le pointeur du fichier dans l'état initial, voici ce que j'ai fait
1) récupération de la position de l'index avec ftell()
2) positionner l'index là où se trouve l'info avec fseek()
3) lire l'info
4) remettre l'index dans sa position initiale avec fssek()
 
Tuto de C ici http://fr.lang.free.fr/cours/Langa [...] e_v2.0.pdf (pour programmation en environnement type Unix)


Message édité par Sve@r le 25-05-2007 à 19:17:34

---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
n°1565432
MagicBuzz
Posté le 25-05-2007 à 19:20:59  profilanswer
 

Emmanuel Delahaye a écrit :

Comme je te l'ai dit, le C n'est pas un langage de débutant en programmation. Trop de pièges, trop laxiste (il demande une extrême rigueur et un haut niveau de maitrise de la part du programmeur pour réaliser un programme industriel sûr et fiable). Et ça n'a rien à voir avec la taille. En une ligne, on peut exploser le système.
 
 
Est-tu obligé de faire ça en C ?  
 
As-tu envisagé Python ?


je plussoie, le C c'est d'la merde je pige rien :D

mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

  aide recuperation donnees d'un fichier texte

 

Sujets relatifs
renommer un fichier uploadéAide sur la somme en VB
besoin d'aide urgent[html] executer ou pas le fichier index.htm
Aide creation requete oracleprob pysqlite (données qui disparaissent)
Conversion durées -> secondes sur un fichier avec sed[Linux] Ecrire du texte en mode console
Plus de sujets relatifs à : aide recuperation donnees d'un fichier texte


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR