Équivalent C à binmode() en perl

Équivalent C à binmode() en perl - C - Programmation

Marsh Posté le 15-08-2005 à 21:42:27    

Bon, le problème est tout con, ça m'étonne qu'il n'ait pas encore été traité ici, mais je me casse les dents là dessus depuis quelques heures. J'ai beau chercher, je ne trouve rien.
 
Donc : comment faire pour éviter que cette p...n de libc sous Windows ne transforme les "\n" en "\n\r", sans refermer le descripteur (ça serait trop simple sinon). J'utilise gcc 3.4.2 sous Dev-Cpp 4.9.9.2
 
Le problème, c'est que je dois envoyer les données sur le descripteur stdout (qui est une socket ouverte par Apache dans un CGI). J'aurais bien utilisé perl, mais le programme en question fait des traitements beaucoup trop couteux pour perl.
 
Arf, et virer Windows n'est pas non plus une option, même si ce n'est pas l'envie qui me manque.


Message édité par tpierron le 15-08-2005 à 21:51:59
Reply

Marsh Posté le 15-08-2005 à 21:42:27   

Reply

Marsh Posté le 15-08-2005 à 22:29:44    

tpierron a écrit :

Donc : comment faire pour éviter que cette p...n de libc sous Windows ne transforme les "\n" en "\n\r", sans refermer le descripteur (ça serait trop simple sinon). J'utilise gcc 3.4.2 sous Dev-Cpp 4.9.9.2


Ouvrir (ou reouvrir : freopen()) le flux en mode binaire ("wb" ou "rb" ).


---------------
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-08-2005 à 22:47:16    

Emmanuel Delahaye a écrit :

Ouvrir (ou reouvrir : freopen()) le flux en mode binaire ("wb" ou "rb" ).


Arf, exactement la réponse que je ne voulais pas:
1. reopen utilise un argument sur le nom de fichier, que je n'ai pas.
2. Si je l'avais, il ferait un fclose() sur le troisième argument, et je ne pourrai plus retourner au client les données.
 
Sinon, j'ai aussi essayé :
* fdopen(fileno(stdout), "wb" ); : même symptôme.
* fcntl : F_GETFL undeclared blablabla ...

Reply

Marsh Posté le 15-08-2005 à 23:39:30    

P...n, j'ai trouvé. 5 heures de bidouillage. Histoire de se coucher moins idiot ce soir, la petite incantation magique pour contourner les bugs^Wfeatures de Windows:
 
setmode(fileno(stdout), O_BINARY); // première instruction de main()
 
Je ne sais pas si c'est portable, mais ça marche dans mon cas.
 
(edit: le plus drôle, c'est que j'ai trouvé ça dams les sources de perl 5.8.7. OpenSource rulez !!)


Message édité par tpierron le 15-08-2005 à 23:41:40
Reply

Marsh Posté le 16-08-2005 à 10:31:15    

Code :
  1. #ifdef WIN32
  2. _fmode = _O_BINARY;   /*sets default for file streams to binary */
  3. setmode(_fileno(stdin), O_BINARY);  /* make the stdio mode be binary */
  4. setmode(_fileno(stdout), O_BINARY);  /* make the stdio mode be binary */
  5. setmode(_fileno(stderr), O_BINARY);  /* make the stdio mode be binary */
  6. #endif


 
Je suis plus très sûr, mais je crois que ça vient du source de php.
 
edit: après vérif, c'est bien ça


Message édité par pascal_ le 16-08-2005 à 10:35:06
Reply

Sujets relatifs:

Leave a Replay

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