Simple lecture de fichier... [ RESOLU ]

Simple lecture de fichier... [ RESOLU ] - C - Programmation

Marsh Posté le 13-05-2008 à 15:08:36    

Bonjour à tous,
 
Je souhaite me balader dans mon fichier via la commande FSEEK et arrivé à un certain point, afficher les 100 caracteres suivants.
 
J'arrrive bien à me déplacer via FSEEK, cependant la seconde partie pêche : je n'arrive pas a afficher ces CENTanés prochains caractères.
NB : le fichier est correctement ouvert car j'ai réussi a faire d'autres lectures.
 
Un peu de code: :
 
 

Code :
  1. char tmp;
  2.    // Deplacement a l'endroit souhaité
  3.    while ( !fscanf(fic, "# Number of Points" ))
  4.    {
  5.  fseek(fic, 1, SEEK_CUR);
  6.    }
  7.    // On affiche 100 caracteres DEBUG  
  8.    for (i = 0;i < 100; i++)
  9.    {
  10.  fscanf (fic , "%c", &tmp);
  11.  printf("%c", tmp);
  12.    }
  13.    getchar();


 
Le resultat sont des points interrogation style code ascii (? avec un fond blanc et rond).
 
 
Merci pour votre aide.


Message édité par jijiz le 14-05-2008 à 14:08:17
Reply

Marsh Posté le 13-05-2008 à 15:08:36   

Reply

Marsh Posté le 13-05-2008 à 15:56:08    

regarde le retour de fscanf toujours

Reply

Marsh Posté le 13-05-2008 à 16:42:49    

ta méthode avec le fscanf n'est pas bonne, puis que fscanf n'a rien à scanner et retourne donc toujours 0 ...
 
Tu ferais mieux de lire ligne par ligne avec fgets, et rechercher avec strstr ta chaine.

Reply

Marsh Posté le 13-05-2008 à 16:43:27    

jijiz a écrit :

eedit : est-il possible de donner en paramètre le numero de ligne où l'on souhaite se positionner au lieu du nombre d'octets.

normal, une ligne c'est juste une vue de l'esprit, c'est une suite de caractères dont le dernier est un \n

Reply

Marsh Posté le 13-05-2008 à 16:55:49    

comme d'habitude ... regarde le retour de fgets. Aucun problème avec un

Code :
  1. char line[....];
  2. while (fgets(line, sizeof line, input) { }


 
Attention aussi à regarder si la line contient un \n final, sinon c'est que la ligne est trop longue pour le buffer.

Reply

Marsh Posté le 13-05-2008 à 17:18:31    

...

Code :
  1. while (fgets(chaine, sizeof chaine, f)) {
  2. // gérer le cas ou la ligne est trop longue
  3. if (strstr(chaine, "# Number of Points" )) {
  4.    // trouvé
  5.   }
  6. }

Message cité 1 fois
Message édité par Taz le 13-05-2008 à 17:19:42
Reply

Marsh Posté le 13-05-2008 à 17:21:38    

bon RTFM, je perds patience.
 
Ta méthode du seek est pourrie. Tu dois lire ton fichier jusqu'à trouver la chaine que tu veux dedans: tu peux faire ça avec fgetc, fread ou fgets. Sauf à coder 337 fgets pour atteindre ta ligne, je vois pas comment se passer de while.

Reply

Marsh Posté le 14-05-2008 à 07:31:44    

ah et dans le while je compare ma chaine a ce que je dois trouvé donc?? Si tu peux/veux réponds à cette dernier question et j'éfface le topic.
Désolé je ne suis pas un l337 de la prog, je suis plutot "algorithmes".


Message édité par jijiz le 14-05-2008 à 07:34:26
Reply

Marsh Posté le 14-05-2008 à 14:07:44    

ok j'ai tout cassé et tout refait ca marche. Un bou de code pour ceux que ca pourrait interesser plus tard :
 
 

Code :
  1. int main(int argc,char **argv)
  2. {
  3.    char *tampon;
  4.    int i;
  5.    int i_tmp;
  6.    i = 0;
  7.    i_tmp = 0;
  8.    size_t *n;
  9.    if (tampon = malloc(100*sizeof(char)))
  10.    {
  11.       printf("malloc good\n" );
  12.    }else
  13.    {
  14.       printf("malloc error\n" );
  15.    }
  16.    FILE *fic = fopen("/home/julien/rectified4.pts", "r" );
  17.    if (fic)
  18.    {
  19.       // TRAITEMENT DES DONNES DE L IMAGE DE GAUCHE
  20.       fgets(tampon, 100, fic);
  21.       // On place la tete de lecture juste apres la chaine "# Number of Points\n"
  22.       while (strcmp(tampon, "# Number of Points\n" ) != 0)
  23.       {
  24.          fgets(tampon, 100, fic);
  25.       }
  26.       // Recuperation du nombre de points contenus dans l'image de gauche
  27.       fscanf(fic,"         %d",&i_tmp);
  28.       // TRAITEMENT DES DONNES DE L IMAGE DE DROITE
  29.       fgets(tampon, 100, fic);
  30.       // On place la tete de lecture juste apres la chaine "# Number of Points\n"
  31.       while (strcmp(tampon, "# Number of Points\n" ) != 0)
  32.       {
  33.          fgets(tampon, 100, fic);
  34.       }
  35.       // Recuperation du nombre de points contenus dans l'image de droite
  36.       fscanf(fic,"         %d",&i_tmp);
  37.       printf("Nombre de pts de l image de droite ! %d\n",i_tmp);
  38.    }else
  39.    {
  40.       printf("Fichier non trouve\n" );
  41.    }
  42. }


 
 
Fichier du type :
 

CIP
#World to TCP
      0.00000     -0.00000      0.00000     -0.00000     -0.00000     -0.00000
#
# LEFT CAMERA
#
# WIDTH  HEIGHT
        1280        1024
#  
# Number of Points
         3
# GRID Coordinates            PIXEL Coordinates
# x    y    z                  x          y
     -360.000     -360.000      0.00000      662.821      433.052
     -320.000     -360.000      0.00000      690.971      431.816
     -280.000     -360.000      0.00000      719.582      430.623
 
#
# RIGHT CAMERA
#
# WIDTH  HEIGHT
        1280        1024
#  
# Number of Points
         5
# GRID Coordinates            PIXEL Coordinates
# x    y    z                  x          y
     -360.000     -360.000      0.00000      597.103      422.370
     -320.000     -360.000      0.00000      624.528      420.832
     -280.000     -360.000      0.00000      652.567      419.463
     -240.000     -360.000      0.00000      681.319      418.252
     -200.000     -360.000      0.00000      710.531      416.756


Reply

Marsh Posté le 14-05-2008 à 15:09:16    

c'est idiot ça, je t'ai montré le code, expliqué qu'il faut vérifier le retour de fgets, vérifier que la ligne contient bien un '\n', et non, tu veux pas.

Reply

Marsh Posté le 14-05-2008 à 15:09:16   

Reply

Marsh Posté le 14-05-2008 à 15:44:54    

Taz a écrit :

c'est idiot ça, je t'ai montré le code, expliqué qu'il faut vérifier le retour de fgets, vérifier que la ligne contient bien un '\n', et non, tu veux pas.


écoute, je n'ai pas compris ton explication et tu m'as annoncé RTFM, j'ai RTFM et trouvé cette solution qui marche et postée car c'est la moindre des choses. Donc maintenant le topic est clos. Je n'ai pas le temps de pinailler sur une autre solution.
 
"Ca c'est idiot, ma méthode avec fseek est pourrie".... Hmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm  :kaola: Bref tu es trop fort et légerement pédant. Désolé mais je n'ai pas ton niveau. Sur ce BONNE JOURNEE (suis un poil vexé).


Message édité par jijiz le 14-05-2008 à 17:53:01
Reply

Marsh Posté le 15-05-2008 à 09:56:27    

il faut en vouloir pour traduire ça
 

Taz a écrit :

...

Code :
  1. while (fgets(chaine, sizeof chaine, f)) {
  2. // gérer le cas ou la ligne est trop longue
  3. if (strstr(chaine, "# Number of Points" )) {
  4.    // trouvé
  5.   }
  6. }



 
en ça
 

Code :
  1. // On place la tete de lecture juste apres la chaine "# Number of Points\n"
  2.       while (strcmp(tampon, "# Number of Points\n" ) != 0)
  3.      {
  4.         fgets(tampon, 100, fic);
  5.      }


Reply

Sujets relatifs:

Leave a Replay

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