Chaînes dynamiques

Chaînes dynamiques - C++ - Programmation

Marsh Posté le 09-06-2003 à 14:39:22    

Je débute en C++ et je suis en train d'essayer de lire des chaînes de tailles variables dans un fichier avec fstream. Et j'ai un petit problème : à chaque fois que j'initialise le buffer de lecture, il fait tout le temps 4 caractères de plus que ce que je mets. Je fais comme ça :
 

Code :
  1. // .... (Récupération de tailleChaine, ouverture du fichier...)
  2. // .....
  3. char * buffer = new char[tailleChaine]; // ça marche mais il y a 4 caractères en trop :(
  4. gFile.read((char *) buffer, tailleChaine);


 
Vous voyez ce qui ne va pas ? :?:

Reply

Marsh Posté le 09-06-2003 à 14:39:22   

Reply

Marsh Posté le 09-06-2003 à 15:22:13    

Post plus de code...  
 
 :bounce:

Reply

Marsh Posté le 09-06-2003 à 15:23:54    

Code :
  1. char * buffer = new char[tailleChaine];
  2. memset(buffer,0,tailleChaine);
  3. gFile.read((char *) buffer, tailleChaine);


Message édité par chrisbk le 09-06-2003 à 15:24:03
Reply

Marsh Posté le 09-06-2003 à 15:49:37    

ok. tu penses quoi de
 

Code :
  1. string mot, ligne;
  2. fichier >> mot;
  3. getline(fichier, ligne);

Reply

Marsh Posté le 09-06-2003 à 15:50:08    

chrisbk a écrit :

Code :
  1. char * buffer = new char[tailleChaine];
  2. memset(buffer,0,tailleChaine);
  3. gFile.read((char *) buffer, tailleChaine);



festival de C  :pfff:    [:tomtom75]

Reply

Marsh Posté le 09-06-2003 à 15:55:15    

++Taz a écrit :

festival de C  :pfff:    [:tomtom75]  


je me contente de modifié le code existant pour que ca colle avec le reste sans aller chercher plus loin

Reply

Marsh Posté le 09-06-2003 à 15:55:17    

chrisbk a écrit :

Code :
  1. char * buffer = new char[tailleChaine];
  2. memset(buffer,0,tailleChaine);
  3. gFile.read((char *) buffer, tailleChaine);




 
Ca ne marche pas non-plus, il y a toujours quatre "ýýýý" à la fin de la chaîne :/ Juste pour voir j'ai aussi essayé :
 

Code :
  1. char * buffer = new char[2]
  2. memset(buffer,0,2)
  3. gFile.read((char *) buffer, 2);


 
Et là aussi, il y a les quatres "ýýýý". En fait, c'est pas à la lecture du fichier que ça déconne mais au niveau du "new char" : au lieu de mettre la taille à n, on dirait qu'il la met à n + 4. Ca peut-être dû à quoi ??

Reply

Marsh Posté le 09-06-2003 à 15:55:53    

++Taz a écrit :

ok. tu penses quoi de
 

Code :
  1. string mot, ligne;
  2. fichier >> mot;
  3. getline(fichier, ligne);




 
Je vais essayer..
 
-- edit: heu non ça ne peut pas marcher non-plus. Je lis un fichier binaire avec des octets et des strings en vrac les uns après les autres (sans 0 pour séparer les chaînes, ni de CR). Donc le getline peut pas marcher si ?


Message édité par _Lyghur_ le 09-06-2003 à 15:58:35
Reply

Marsh Posté le 09-06-2003 à 15:55:59    

manque le \0 a la fin
 
 
 

Code :
  1. char * buffer = new char[3]
  2. memset(buffer,0,3)
  3. gFile.read((char *) buffer, 2);

 
 
la c ok
alloue un caractere de plus a ton souc (buffer)

Reply

Marsh Posté le 09-06-2003 à 16:07:00    

C'était bien ça !!! Merci :jap:

Reply

Marsh Posté le 09-06-2003 à 16:07:00   

Reply

Marsh Posté le 09-06-2003 à 16:08:46    

_Lyghur_ a écrit :


 
Je vais essayer..
 
-- edit: heu non ça ne peut pas marcher non-plus. Je lis un fichier binaire avec des octets et des strings en vrac les uns après les autres (sans 0 pour séparer les chaînes, ni de CR). Donc le getline peut pas marcher si ?

ah ben ok, faut aussi apprendre à t'exprimer. c'est pas des chaines, c'est une suite de caractères. a ce moment là je vois pas ou est le problème de l'\0 final
 
le memset c'est bof (C) et ne sert à rien du tout dans ton cas. le cast est pas bon (istream&  read (char* s, streamsize n ); ) car C et inutile.


Message édité par Taz le 09-06-2003 à 16:11:45
Reply

Marsh Posté le 09-06-2003 à 16:09:52    

chrisbk a écrit :

manque le \0 a la fin

voir son edit: il travaille enfait avec de octets. je vois pas d'interet de mettre un '\0' à la fin. si tu lis avec un read, t'ecris avec un write.

Reply

Marsh Posté le 09-06-2003 à 16:10:39    

++Taz a écrit :

voir son edit: il travaille enfait avec de octets. je vois pas d'interet de mettre un '\0' à la fin. si tu lis avec un read, t'ecris avec un write.


 
ben visiblement j'avais mis dans le mille, et a mon idée il attaque ca au printf/cout par derriere donc bon :D

Reply

Marsh Posté le 09-06-2003 à 16:13:30    

moi je comprends pas comment il fait sans \0 et sans \n pour déterminer qu'il a lu une ligne et decider d'afficher.
 
si ton truc c'est juste une série de mot séparée par des esapces (ou tab), l'exemple

Code :
  1. string mot;
  2. fichier >> mot;

marche parfaitement

Reply

Marsh Posté le 09-06-2003 à 16:41:03    

Toutes les chaînes sont collées les unes aux autres et j'ai inclu dans le fichier un entête avec la taille de chaque chaîne, sa position dans le fichier, un ID et quelques autres trucs. C'est peut-être pas la meilleure solution mais ça marche bien (depuis peu :D ) et c'est rapide (pas besoin de lire tout le fichier pour lire une chaîne puisque tu connais sa position dans le fichier).
 

Citation :

le cast est pas bon (istream&  read (char* s, streamsize n ); ) car C et inutile.


 
Heu... je comprends pas ce que tu veux dire par là. Pourquoi le cast est pas bon et pourquoi c'est inutile ? :??:


Message édité par _Lyghur_ le 09-06-2003 à 16:41:53
Reply

Marsh Posté le 09-06-2003 à 17:02:28    

Citation :

char * buffer = new char[2]
  memset(buffer,0,2)
  gFile.read((char *) buffer, 2);

Reply

Marsh Posté le 09-06-2003 à 17:39:53    

ok mais si tu pouvais t'exprimer en français plutôt qu'en C, ça m'arrangerais... enfin tant pis...

Reply

Marsh Posté le 09-06-2003 à 17:43:56    

Code :
  1. char * buffer;
  2. ///...
  3. istream&  read (char* s, streamsize n );
  4. ///...
  5. gFile.read((char *) buffer, 2);


 
à quoi sert le cast
 

Reply

Sujets relatifs:

Leave a Replay

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