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

  FORUM HardWare.fr
  Programmation
  C++

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

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°197561
physis
Posté le 19-08-2002 à 23:14:34  profilanswer
 

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
mood
Publicité
Posté le 19-08-2002 à 23:14:34  profilanswer
 

n°197636
MagicBuzz
Posté le 20-08-2002 à 02:39:09  profilanswer
 

tu veux une corde ? :D

n°197638
zion
Plop
Posté le 20-08-2002 à 02:44:11  profilanswer
 

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
n°197639
MagicBuzz
Posté le 20-08-2002 à 02:45:22  profilanswer
 

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

n°197643
LeGreg
Posté le 20-08-2002 à 03:07:38  profilanswer
 

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

n°197646
zion
Plop
Posté le 20-08-2002 à 03:49:19  profilanswer
 

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
n°197743
physis
Posté le 20-08-2002 à 09:58:15  profilanswer
 

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.
 

n°197852
LeGreg
Posté le 20-08-2002 à 11:41:52  profilanswer
 

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

n°197959
physis
Posté le 20-08-2002 à 14:06:18  profilanswer
 

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:

n°198088
Jar Jar
Intaigriste
Posté le 20-08-2002 à 16:02:38  profilanswer
 

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
mood
Publicité
Posté le 20-08-2002 à 16:02:38  profilanswer
 

n°198104
LeGreg
Posté le 20-08-2002 à 16:16:57  profilanswer
 

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

n°198417
Musaran
Cerveaulté
Posté le 21-08-2002 à 01:30:06  profilanswer
 

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
n°198421
zion
Plop
Posté le 21-08-2002 à 01:58:03  profilanswer
 

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

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

 

Sujets relatifs
[PHP & HTML] nouveau problème de syntaxe (résolu)Comment enregistrer automatiquement une page PHP en HTML ? [RESOLU]
[VB 6] savoir ou notre application a été installé[RESOLU][QT for Linux] newbie inside... [RESOLU !!! :)]
[Visual C++] propriété d'un CButton [RESOLU][HTML CSS] select et style [resolu]
[Java + WebObject] Suppression d'une ligne d'une bd (Resolu)[Java] ResultSet et Date (résolu)
tri -> mise en page qui foire... [ resolu ][VBA]Pb de formules sous excel avec vba (résolu)
Plus de sujets relatifs à : [C] A votre bon coeur, aidez moi a parser ca (resolu)


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