[C] charger un fichier texte en tableau

charger un fichier texte en tableau [C] - C - Programmation

Marsh Posté le 14-05-2005 à 13:52:28    

bonjour,
 
je me retrouve encore avec un petit souci de programmation. J'ai tout d'abord un programme qui me crée des images de type PBM, images monochromes, en fait simplement un fichier texte qui ressemble à ca
 
P1 (ca c'est pour dire que c'est un PBM)
3 3 (la taille de l'image ici 3x3)
1 0 1
0 0 0
0 1 0 (la valeur des pixels)
 
jusque là pas de problèmes, tout ce passe pour le mieux mais j'ai ensuite besoin de créer un programme qui va exploiter ces images. Donc toujours en C je veux pouvoir transformer mon fichier texte en tableau 2 dimensions. fscanf ne me permet pas de le faire aussi facilement que je le voudrais (des dizaines voire des centaines de \t ou \n à taper ca ne me botte pas) donc si quelqu'un a déjà rencontré le problème, il aura peut être des pistes à me proposer.
 
Si jamais je n'ai pas été assez clair n'hésitez pas à me poser des questions.
 
Bon Week end

Reply

Marsh Posté le 14-05-2005 à 13:52:28   

Reply

Marsh Posté le 14-05-2005 à 13:59:35    

je dirais fgets pour lire une ligne, apres tronconne la ligne avec strtok et convertis chaque sous chaine en entier avec strtod


Message édité par skelter le 14-05-2005 à 13:59:54
Reply

Marsh Posté le 14-05-2005 à 14:52:06    

skelter a écrit :

je dirais fgets pour lire une ligne, apres tronconne la ligne avec strtok et convertis chaque sous chaine en entier avec strtod


Pas besoin de strtok(), Une boucle avec strtod() ou strto[u]l fait le boulot. Utiliser le 2ème paramètre.


---------------
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/
Reply

Marsh Posté le 14-05-2005 à 14:52:34    

ouh la que de termes barbares strtok, strtod....
 
mais ca ressemble bien à ce que je pensais, merci pour l'indication, je vais creuser pour voir ou ca méne, et comment marche ces fonctions
 
:jap:

Reply

Marsh Posté le 14-05-2005 à 14:53:27    

les réponses vont décidément trop vite sur ce forum
 
merci encore pour la réactivité

Reply

Marsh Posté le 14-05-2005 à 14:56:30    

mrpp a écrit :

ouh la que de termes barbares strtok, strtod....
 
mais ca ressemble bien à ce que je pensais, merci pour l'indication, je vais creuser pour voir ou ca méne, et comment marche ces fonctions


C'est simple en fait.
 
str : concerne les chaines (strings)
tok : de 'token', élément unitaires d'un analyseur.
tod : to d : vers double : conversion chaine vers double.
tol : to l : vers long : conversion chaine vers long.
toul : to ul : vers unsigned long : conversion chaine vers unsigned long.


---------------
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/
Reply

Marsh Posté le 14-05-2005 à 15:43:49    

je vois pas très bien comment je pourrais me passer de strtok, je vais être obligé de tronconner ma chaine de caractères en éléments unitaires sinon il va me faire un tableau une dimension avec des doubles 1010111011000010010 ce qui ne m'intéresse pas.
A moins que je ne me trompe (ce qui peut arriver parfois :whistle:).
Au fait strtoi (to int) n'a pas l'air d'exister c'est dommage j'aurais pu ganger une ligne de code ( je pinaille...)
 
 
 
et pour reprendre les propos d'emmanuelle "c'est simple en fait" comme toujours


Message édité par mrpp le 14-05-2005 à 15:44:20
Reply

Marsh Posté le 14-05-2005 à 15:51:20    

j'ai été trop vite, tu peux en effet te passer de strtok
lis le man a propos su 2e parametres de strto*
http://www.rt.com/man/strtol.3.html

Reply

Marsh Posté le 14-05-2005 à 16:05:59    

mrpp a écrit :

et pour reprendre les propos d'emmanuelle


Emmanuelle ? Ne rêve pas trop quand même...
C'est Emmanuel...
 


---------------
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/
Reply

Marsh Posté le 14-05-2005 à 16:06:47    

mrpp a écrit :

je vois pas très bien comment je pourrais me passer de strtok,<...>

On te l'a déjà dit : strto[u]l()...
 
edit : faute de frappe corrigée...


Message édité par Emmanuel Delahaye le 14-05-2005 à 17:46:35

---------------
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/
Reply

Marsh Posté le 14-05-2005 à 16:06:47   

Reply

Marsh Posté le 14-05-2005 à 17:22:58    

Emmanuel Delahaye a écrit :

Emmanuelle ? Ne rêve pas trop quand même...
C'est Emmanuel...


 
 
 
 :whistle: ah oui mince j'ai lu trop vite excusez moi monsieur Delahaye, je le referais plus, et pour strtol[u]() aussi, j'ai cru que c'était une faute de frappe, bon je vais arréter les questions pour aujourd'hui, je me plongerais bien à fond demain, sinon je risque encore de cumuler les bourdes.

Reply

Marsh Posté le 14-05-2005 à 17:45:53    

mrpp a écrit :

<...>pour strtol[u]() aussi, j'ai cru que c'était une faute de frappe


C'est une faute de frappe. C'est strto[u]l(), ce qui signifie:
 
strtol()
ou
strtoul()


---------------
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/
Reply

Marsh Posté le 15-05-2005 à 15:44:10    

Je viens de tester, merci encore pour vos réponses. Ca marche pas mal mais j'ai encore du taffe sur les pointeurs et les chaines de caractere pour comprendre comment me servir du deuxième argument de strtol.
Mais bon d'ici à ce soir ça devrait marcher (enfin je l'éspére).

Reply

Marsh Posté le 15-05-2005 à 16:36:37    

alors voila ou je me trouve actuellement
 
#include <stdio.h>
 
 
int main(void)  
{
FILE * fic;
 
char msg[20],*end;
 long n;
 
 
fic = fopen("test.dat", "r" );
/* le fichier test.dat est constitué de lignes de type 1 2 3 4 5.... de moins de vingt caractéres*/
 
fseek( fic, 0, SEEK_SET);
 
fgets( msg, sizeof(msg), fic);
printf( "%s", msg);
 
 
 
fgets( msg, sizeof(msg), fic);
printf( "%s", msg);
 
/* jusque là ca marche ca m'affiche bien mes lignes de caractère */
 
 n=strtol(msg,&end,6);
printf( "%d\n", n);
/*la aussi ca marche ca me prend le premier caractere le transforme long*/
 
 
 
/*la c'est le début de la fin*/
/*comme je voyais pas comment me servir du deuxieme argument je l'ai rangé */
/*betement en premier argument. mais après j'ai plus que des zéros*/
 
 n=strtol(&end,&end,6);
printf( "%d\n", n);
 n=strtol(&end,&end,6);
printf( "%d\n", n);
 
/*donc je me suis dit peut etre que ca pointe sur l'espace et à chaque fois sur*/
/*le meme caractere j'ai donc tenté de décaler le pointeur de 1*/
/*ca me sort un résultat diff de 0 mais rien que je n'arrive à comprendre*/
 n=strtol(&end+1,&end,6);
printf( "%d\n", n);
 
fgets( msg, sizeof(msg), fic);
printf( "%s", msg);
}
 
 
 
 
je suis un peu perdu là, j'ai pas de bouquins de c sous la main, donc il faudra que j'attende la semaine prochaine pour passer à la bibliothéque. Si vous avez la patience de m'expliquer ou si c'est super bête faites le moi savoir.
 
 
Bonne fin de week end

Reply

Marsh Posté le 15-05-2005 à 17:00:55    

mrpp a écrit :


<...>
je suis un peu perdu là, j'ai pas de bouquins de c sous la main,  


C'est une plaisanterie ?
google:  man fgets
 
Ton code mis au point. Pose des questions si tu ne comprends pas.


#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
 
int main (void)
{
   char const fname[] = "../data/test.txt";
   FILE *fic = fopen (fname, "r" );
 
   if (fic != NULL)
   {
      char msg[20];
 
/* le fichier test.dat est constitue de lignes
 * de type 1 2 3 4 5.... de moins de vingt caracteres
 
1 2 3 4 5 6
7 8 9 10 11
12 13 14 15
 
 */
      while (fgets (msg, sizeof msg, fic) != NULL)
      {
         char *pend = msg;
         printf ("msg='%s'\n", pend);
 
         while (pend != NULL && *pend != '\n' && *pend != 0)
         {
            long n = strtol (pend, &pend, 10);
            printf ("n=%ld\n", n);
         }
      }
      fclose (fic), fic = NULL;
   }
   else
   {
      perror (fname);
   }
   assert (fic == NULL);
   return 0;
}


Message édité par Emmanuel Delahaye le 15-05-2005 à 18:21: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/
Reply

Marsh Posté le 15-05-2005 à 18:03:01    

Emmanuel Delahaye a écrit :


C'est une plaisanterie ?
google:  man fgets
 


 
 
Je vois en quoi le fait de ne pas avoir de bouquins sous la main reléve de la plaisanterie. fgets n'est pas mon problème ,et je me focalisais sur strtol, mon problème. J'y comprends pas grand chose aux chaines de caractéres avec  lesquels je ne suis pas familier, et j'ai un peu de mal avec les pointeurs (mais ça commence à rentrer). Je voulais donc prendre un livre de C pour reprendre doucement toutes les bases. Ce qui présentait l'avantage d'avoir une oraganisation moins bordellique qu'internet, d'orienter les recherches, et de filer un tant soit peu de théorie. maintenant j'ai l'impression de t'avoir quelque peu exaspéré avec mes questions un peu con mais je dois te reconnaitre une grande qualité de continuer à me répondre avec pertinence et patience.
 
 
et en gros mon erreur dans mon code tout moche est d'avoir mélangé end avec &end. merci :jap:  
 
 

Reply

Marsh Posté le 15-05-2005 à 18:03:32    

en gros c'était super bete

Reply

Marsh Posté le 15-05-2005 à 18:20:43    

mrpp a écrit :

Je vois en quoi le fait de ne pas avoir de bouquins sous la main reléve de la plaisanterie. fgets n'est pas mon problème ,et je me focalisais sur strtol, mon problème.


Alors "man strtol" ...
 
Sinon, sur mon site (ma .sig) j'indique une références de bouquin en ligne... ( en anglais)

Citation :

J'y comprends pas grand chose aux chaines de caractéres avec  lesquels je ne suis pas familier


"Une chaine de caractère est un tableau de char terminé par un 0."
 
Quels sont les mots que tu ne comprends pas ?

Citation :

et j'ai un peu de mal avec les pointeurs (mais ça commence à rentrer). Je voulais donc prendre un livre de C pour reprendre doucement toutes les bases.


En général, c'est par là qu'on commence!

Citation :

et en gros mon erreur dans mon code tout moche est d'avoir mélangé end avec &end.


Ce que n'importe quel compilateur bien reglé t'aurait fait remarqué...


Message édité par Emmanuel Delahaye le 15-05-2005 à 18:39:16

---------------
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/
Reply

Marsh Posté le 15-05-2005 à 18:27:35    

Emmanuel Delahaye a écrit :

Alors "man strtol" ...
 
Sinon, sur mon site (ma .sig) j'indique une références de bouquin en ligne... ( en anglais)

Citation :

J'y comprends pas grand chose aux chaines de caractéres avec  lesquels je ne suis pas familier


"Une chaine de caractère est un tableau de char terminé par un 0."
 
Quels sont les mots que tu ne comprends pas ?

Citation :

et j'ai un peu de mal avec les pointeurs (mais ça commence à rentrer). Je voulais donc prendre un livre de C pour reprendre doucement toutes les bases.


En général, c'est par là qu'on commence!

Citation :

et en gros mon erreur dans mon code tout moche est d'avoir mélangé end avec &end.


Ce que n'importe quel compilateur bien reglé t'aurais fait remarqué...


 
 
j'aime beaucoup le papier, j'en mange même, donc les bouquins en ligne c'est pas mon trip et j'ai pas l'habitude de manipuler des chaines de caractere, mais tu n'étais pas forcément obligé de reprendre chaque point de mes messages pour essayer de m'enfoncer.
A la prochaine  

Reply

Marsh Posté le 15-05-2005 à 18:41:06    

mrpp a écrit :

j'ai pas l'habitude de manipuler des chaines de caractere


Une fois que tu as la définition gravée dans le crâne, je ne vois pas bien quels problèmes tu peux avoir... à part un manque d'entrainement.
 


---------------
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/
Reply

Marsh Posté le 15-05-2005 à 18:46:23    

bon moi je m'arréte de te répondre là, j'aurais plein de trucs à dire, du genre je débute en programmation, j ai pas toutes les fonctions en tête, celle que je connais je ne vois pas toute leur portée... ou un manque d'entrainement.
mais comme tu te bornes à ne lire que ce qui t'intéresse dans mes messages, je ne tiendrais plus compte de tes remarques, même si je passe à coté d'une aide fort utile. Nous n'avons pas tous ton niveau en programmation ni même l'habitude de conceptualiser correctement des questions en programmation, alors je ne tenterais plus de t'expliquer ce que tu ne veux pas comprendre.
 

Reply

Marsh Posté le 15-05-2005 à 18:54:04    

mrpp a écrit :

<...> je ne tenterais plus de t'expliquer ce que tu ne veux pas comprendre.


Tu fais ce que tu veux, t'es grand...


---------------
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/
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed