fstream et espaces

fstream et espaces - C++ - Programmation

Marsh Posté le 07-12-2003 à 21:52:04    

Bonjour,  
 
j'ouvre un fichier en utilisant fstream, et je voudrais pouvoir le lire caractère par caractère. le problème est que fstream enleve apparement les espaces de ce qu'il me renvoit. y a-t-il moyen d'eviter ca ?


---------------
-( BlackGoddess )-
Reply

Marsh Posté le 07-12-2003 à 21:52:04   

Reply

Marsh Posté le 07-12-2003 à 21:58:08    

tu dois te planter qq part, ça m'étonnerai fort qu'un stream bouffe des octets sous prétexte qu'ils valent 0x20 [:gratgrat]


Message édité par schnapsmann le 07-12-2003 à 21:58:41

---------------
From now on, you will speak only when spoken to, and the first and last words out of your filthy sewers will be "Sir!"
Reply

Marsh Posté le 07-12-2003 à 22:00:46    

Code :
  1. std::ifstream ifs("fichier.txt" )
  2. char c;
  3. while(ifs.get(c))
  4. {
  5.   // fais ce que tu veux avec c
  6. }

Reply

Marsh Posté le 07-12-2003 à 22:03:49    

bin ... c bizarre ... j'ai du faire une erreur qq part : au bout d'un moment il me retourne n'importe quoi ...
 

Code :
  1. union Convert
  2. {
  3. unsigned long ul;
  4. char c[4];
  5. };
  6. class FileHeader
  7. {
  8. public:
  9. unsigned long sign;
  10. unsigned long nbDigits;
  11. friend istream & operator>>(istream & Flux, FileHeader & Hdr)
  12. {
  13.  Convert conv;
  14.  string s;
  15.  // on lit les 8 1ers caractères du flux
  16.  char c;
  17.  for(int i=0; i<8; i++)
  18.  {
  19.   Flux >> c;
  20.   s.push_back(c);
  21.  }
  22.  memcpy(conv.c, s.data(), 4);
  23.  Hdr.sign = conv.ul;
  24.  memcpy(conv.c, s.data()+4, 4);
  25.  Hdr.nbDigits = conv.ul;
  26.  return Flux;
  27. }
  28. };
  29. void CConfig::LoadFromFile(const string & FileName)
  30. {
  31. fstream f;
  32. f.open(FileName.c_str(), ios_base::in);
  33. if(!f.is_open()) throw exception("Impossible d'ouvrir le fichier." );
  34. FileHeader Hdr;
  35. f >> Hdr;
  36. // .....


 
pour cette 1ere lecture (f >> Hdr;) ca marche bien, mais apres j'en lis d'autre exactement sur le même principe et au bout d'un moment ca lit n'importe pas (pas le contenu du fichier en tout cas)


---------------
-( BlackGoddess )-
Reply

Marsh Posté le 07-12-2003 à 22:09:35    

le >> n'a pas le meme sens, effectivement, il cherche un caractère qui n'est pas isspace
 
pas mal tes excepions mais n'utilise pas std::exception, dérive la tienne plutot
 
pour ton fichier, compacte le tout en
 
ifstream f(FileName.c_str());
 
et après test, peut être préférablement avec f.good()
 
l'union peut être de porter interne à la classe
 
évite les nombre magique (utilise plutot sizeof)
evite les friend, définit plutot
 
FH::print(ostream & )
 
et après en externe pas friend
 

Code :
  1. inline ostream & operator<<(ostream &, const FH & )
  2. {
  3.   f.print(os);
  4.   return os;
  5. }


 

Reply

Marsh Posté le 07-12-2003 à 22:16:32    

et aufait, pourquoi ne pas utiliser les méthode read et write plutot que de faire des unions ?

Reply

Marsh Posté le 07-12-2003 à 22:41:39    

bien, merci pour ces conseils :)  
j'utilise un nombre magique car c'est une liste (à taille variable) que je dois lire
pour la place des unions, c'est parce que je les utilisais dans d'autres classes du même style
je vais me documenter sur les methodes read et write, que je ne connaissais pas :)  
pour les exceptions, ok :)
sinon, pourquoi eviter les friend ? pour une meilleure gestion des droits d'acces ?


Message édité par blackgoddess le 07-12-2003 à 22:42:02

---------------
-( BlackGoddess )-
Reply

Marsh Posté le 07-12-2003 à 22:46:59    

ben comme je t'ai dit pour les friend. regarde vite du cote de read/write (E/S binaire, pas la peine de faire des acrobaties)

Reply

Marsh Posté le 07-12-2003 à 22:58:02    

ah, oui, read et write m'evite des complications, ca marche nickel, merci bcp :)


---------------
-( BlackGoddess )-
Reply

Sujets relatifs:

Leave a Replay

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