[C++] Lire un fichier

Lire un fichier [C++] - C++ - Programmation

Marsh Posté le 21-03-2003 à 23:14:25    

Dommage... Sauf si tu peux rester sous Win32 : les fonctions du type CreateFileMapping et autres sont tout a fait adaptées pour ce ke tu sembles vouloir faire, sont extrement rapides, et assez faciles a comprendre.
 
Apres si le code doit aussi tourner sous linux ou autres nivos, reste plus que les ifstream...

Reply

Marsh Posté le 21-03-2003 à 23:14:25   

Reply

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

pour la lecture d'un bloc:

Code :
  1. char buf[N];
  2. ifstream f(...);
  3. f.read(buf, N);


 
Pour la taille d'un flux:

Code :
  1. #include <iostream>
  2. using namespace std;
  3. //Renvoie la taille des données d'un flux (issu de basic_istream ou basic_ostream), -1 en cas d'échec.
  4. //Taille binaire si la distinction binaire/texte existe.
  5. //Notez qu'un flux n'a pas nécessairement de notion de taille ou position.
  6. //Ne pas confondre avec streamsize (sans _), qui est un typedef STL.
  7. template <typename E, typename T>
  8. inline
  9. basic_istream<E,T>::pos_type
  10. stream_size(basic_istream<E,T>& bis)
  11. {
  12. basic_istream<E,T>::pos_type savepos, lastpos;
  13. savepos= bis.tellg() ; bis.seekg(0, ios::end) ; //sauvegarder la position et aller en fin
  14. lastpos= bis.tellg() ; bis.seekg(savepos    ) ; //lire la taille et rétablir la position
  15. return lastpos;
  16. }
  17. template <typename E, typename T>
  18. inline
  19. basic_ostream<E,T>::pos_type
  20. stream_size(basic_ostream<E,T>& bos)
  21. {
  22. basic_ostream<E,T>::pos_type savepos, lastpos;
  23. savepos= bos.tellp() ; bos.seekp(0, ios::end) ; //sauvegarder la position et aller en fin
  24. lastpos= bos.tellp() ; bos.seekp(savepos    ) ; //lire la taille et rétablir la position
  25. return lastpos;
  26. }
  27. //L'héritage double étant ambigü, ceci force arbitrairement le mode 'input'
  28. template <typename E, typename T>
  29. inline
  30. basic_iostream<E,T>::pos_type
  31. stream_size(basic_iostream<E,T>& bios)
  32. {
  33. return stream_size(static_cast<basic_istream<E,T>&>(bios));
  34. }


Exemple d'utilisation:

Code :
  1. ifstream ifs("foo.txt" );
  2. long taillefoo= stream_size(ifs);


Message édité par Musaran le 22-03-2003 à 07:50:23

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

Marsh Posté le 22-03-2003 à 19:30:32    

Attention tout de meme, si tu utilises un lecteur de bande, ça va être long pour se positionner à la fin du fichier :-)
Je ne sais pas si la fonction "stat" différe selon les systèmes (même si ce n'est pas dans la norme C++ ou C), mais tu peux eventuellement l'utiliser...

Reply

Marsh Posté le 22-03-2003 à 21:24:11    

Et les fct CreateFile() (ouvre le fichier) puis GetfileSize() (recupere sa taille) et ReadFile() (lire x octets), elles sont pas bien ?

Reply

Marsh Posté le 22-03-2003 à 21:42:14    

Konar a écrit :

Et les fct CreateFile() (ouvre le fichier) puis GetfileSize() (recupere sa taille) et ReadFile() (lire x octets), elles sont pas bien ?


La fonction "stat" est présente sur plusieurs systèmes, pas "CreateFile".

Reply

Marsh Posté le 22-03-2003 à 23:38:12    

kenshiro182 a écrit :


La fonction "stat" est présente sur plusieurs systèmes, pas "CreateFile".


 
Moui... mais on peut présumer que le portage d'une application mfc vers une application sans mfc se déroulera toujours sur plateforme win32. Dans le cas contraire, j'aimerais bien savoir quelle application mfc peut se convertir vers linux ou autres (d'ailleurs dans ce cas autant réécrire tout le prog, inutile de parler de conversion...)

Reply

Sujets relatifs:

Leave a Replay

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