[C] A votre bon coeur, aidez moi a parser ca (resolu)

A votre bon coeur, aidez moi a parser ca (resolu) [C] - C++ - Programmation

Marsh Posté le 19-08-2002 à 23:14:34    

j'ai un fichier provenant d'un programme externe que je dois parser en C.
 
en gros dans le fichier ya "tata<CR>titi<CR>toto" ou <CR> est le retour de ligne (13 en decimal, 0d en hexa).
 
je fais en C ce code la:
 

Code :
  1. FILE *fic;
  2. char c;
  3. fic = fopen(<nom du fichier>, "r" );
  4. if (fic==NULL) {
  5.   printf("Erreur d'ouverture\n" );
  6.   exit(EXIT_FAILURE);
  7. } //if
  8. for (i=0; i<9; i++) {
  9.   fread(&c, 1, 1, fic);
  10.   printf("%x\n", c); // on affiche en hexa le code de c
  11. } // for
  12. close(fic);


 
a l'affichage j'ai mes <CR> qui sont manges et tu coup ca m'affiche ca:
 

Code :
  1. 74
  2. 61
  3. 74
  4. 61 <- tata jusque la
  5. 74 <- debut du toto, mais ou est passe 0d ?
  6. 69
  7. 74
  8. 69
  9. 74
  10. ...


 
Un peu d'aide ne serait pas de refus.
 
merci d'avance


Message édité par physis le 20-08-2002 à 14:06:53
Reply

Marsh Posté le 19-08-2002 à 23:14:34   

Reply

Marsh Posté le 20-08-2002 à 02:39:09    

tu veux une corde ? :D

Reply

Marsh Posté le 20-08-2002 à 02:44:11    

1. le retour à la ligne c'est #13#10 sous Windows (t'as pas précisé l'OS)
 
2. c'est quoi tes 64/71?
 
3. Et euh, si y a eu retour à la ligne (j'ai vraiment du mal a piger ton histoire), c'est que ton #13 a pas été mangé
 
Allez, racontes ;-)


---------------
Informaticien.be - Lancez des défis à vos amis
Reply

Marsh Posté le 20-08-2002 à 02:45:22    

Zion a écrit a écrit :

1. le retour à la ligne c'est #13#10 sous Windows (t'as pas précisé l'OS)
 
2. c'est quoi tes 64/71?
 
3. Et euh, si y a eu retour à la ligne (j'ai vraiment du mal a piger ton histoire), c'est que ton #13 a pas été mangé
 
Allez, racontes ;-)




1) Je ça empêche pas qu'ils sont pas dans son truc
2) 64/71 etc. c'est les codes ASCII des caractères
3) c pour ça que je lui propose une corde :D

Reply

Marsh Posté le 20-08-2002 à 03:07:38    

physis a écrit a écrit :

en gros dans le fichier ya "tata<CR>titi<CR>toto" ou <CR> est le retour de ligne (13 en decimal, 0d en hexa).




 
tu ferais bien d'ouvrir ton fichier en mode binaire si tu veux faire joujou avec le codage des caracteres.
Le mode texte est la pour rendre le code C portable sous unix et windows, attention donc a ce qu'il ne te mange pas des caracteres.
 
LeGreg

Reply

Marsh Posté le 20-08-2002 à 03:49:19    

MagicBuzz a écrit a écrit :

 
1) Je ça empêche pas qu'ils sont pas dans son truc
2) 64/71 etc. c'est les codes ASCII des caractères
3) c pour ça que je lui propose une corde :D




 
Ah ouai merde, j'avais pas vu le %x  :ange:  
 
 
http://www.informaticien.be/images/smiles/hanged.gif


---------------
Informaticien.be - Lancez des défis à vos amis
Reply

Marsh Posté le 20-08-2002 à 09:58:15    

legreg a écrit a écrit :

 
 
tu ferais bien d'ouvrir ton fichier en mode binaire si tu veux faire joujou avec le codage des caracteres.
Le mode texte est la pour rendre le code C portable sous unix et windows, attention donc a ce qu'il ne te mange pas des caracteres.
 
LeGreg




 
le fichier est deja ouvert en binaire en faisant un fopen.
 
en fait je viens de decouvir que c'est mon compilateur delorie/gcc pour dos qui ne va pas; quant a savoir si c'est un bug, je vais un peu plus me renseigner (si qq peu le faire ici, ca m'aiderait pas mal).
 
je prends ce meme code source et je le compile avec lccwin32 ca marche bien (je vois bien a l'affichage le "0d" ), par contre avec gcc 3.1 ou 2.95 ca passe pas.
 
donc je cherche un autre compilateur sous dos (dos parce que j'ai des imperatifs) en free si possible.
 

Reply

Marsh Posté le 20-08-2002 à 11:41:52    

physis a écrit a écrit :

le fichier est deja ouvert en binaire en faisant un fopen.



 
je ne vois pas de 'b' dans ta chaine de mode d'ouverture:

Code :
  1. fic = fopen(<nom du fichier>, "r" );


 
Au moins si tu mets le 'b', tu seras sur que le choix par défaut du compilateur sera le bon..
 
LeGreg

Reply

Marsh Posté le 20-08-2002 à 14:06:18    

legreg a écrit a écrit :

 
 
je ne vois pas de 'b' dans ta chaine de mode d'ouverture:

Code :
  1. fic = fopen(<nom du fichier>, "r" );


 
Au moins si tu mets le 'b', tu seras sur que le choix par défaut du compilateur sera le bon..
 
LeGreg




 
Je te remercie pour ton aide, maintenant ca a l'air de fonctionner correctement. Effectivement, il fallait "forcer" l'ouverture en binaire (chose qui a l'air d'etre faite avec lccwin32 ou gcc sous HP-UX).
 
Jusqu'a présent, je pensais (du moins ce que je faisais a la fac):
 - open -> ouverture en ascii,
 - fopen -> ouverture en binaire.
 
 :sol:

Reply

Marsh Posté le 20-08-2002 à 16:02:38    

physis a écrit a écrit :

Je te remercie pour ton aide, maintenant ca a l'air de fonctionner correctement. Effectivement, il fallait "forcer" l'ouverture en binaire (chose qui a l'air d'etre faite avec lccwin32 ou gcc sous HP-UX).


Sous Unix (et peut-être aussi sous Windows), le flag "b" n'a aucune signification. Du coup, c'est vrai qu'on a tendance à l'oublier quand on travaille habituellement sous Unix.
 

Citation :

Jusqu'a présent, je pensais (du moins ce que je faisais a la fac):
 - open -> ouverture en ascii,
 - fopen -> ouverture en binaire.

Ça n'a rien à voir. L'appel open se contente de renvoyer un descripteur de fichier sous forme d'entier, alors que fopen renvoie un descripteur de flux (type FILE), qui permet de réaliser des opérations tamponnées (et donc plus rapides).


---------------
« No question is too silly to ask, but, of course, some are too silly to answer. » -- Perl book
Reply

Marsh Posté le 20-08-2002 à 16:02:38   

Reply

Marsh Posté le 20-08-2002 à 16:16:57    

le 'b' est justement la pour la compatibilité unix/windows.
Mais bon, on vous en voudra pas de l'oublier..
 
Ceci dit:
fopen c'est la norme ANSI (qui peut egalement fonctionner en mode non tamponné)
open sous Unix ou _open sous windows c'est la norme OS.
 
LeGreg

Reply

Marsh Posté le 21-08-2002 à 01:30:06    

C'est pas normal qu'ils soient mangés !
 
Les sauts de ligne du PC sont faits de 2 caractères: 13 & 10, soit 0D 0A en hexa, ou CR+LF.
Par défaut, les fichiers sont ouvert en mode texte, ce qui convertit ces sauts doubles en simple LF.
Si ton texte vient d'une machine étrangère, et qu'il n'a qu'un simple CR ou LF, c'est peut-être ça qui le mange.
 
Solution:
-soit ouvrir avec fopen(..., "rb" );
-soit mettre au niveau global _fmode= _O_BINARY ;
Et gérer soi-même ce fichu saut !


---------------
Bricocheap: Montage de ventilo sur paté de mastic silicone
Reply

Marsh Posté le 21-08-2002 à 01:58:03    

Reply

Sujets relatifs:

Leave a Replay

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