[C++] Lecture de fichier

Lecture de fichier [C++] - C++ - Programmation

Marsh Posté le 04-09-2004 à 00:57:20    

Bon voila, jviens de me remettre aux études. J'ai pratiquement pas touché au C depuis 3 ans et me voilà à mon premier TP.
 
Lorsque j'ai appris le C, je faisais la lecture de fichier avec fopen, fread, fclose. Mais si je me trompe pas, ca c'est du C.
 
Désirant m'approcher le plus possible du concept du C++, je dois utiliser cin ou bien le fopen, fread, fclose est tout de même approprié en C++?
 
merci à Taz à l'avance :D

Reply

Marsh Posté le 04-09-2004 à 00:57:20   

Reply

Marsh Posté le 04-09-2004 à 00:58:03    

std::istream, std::ostream et leur classes filles

Reply

Marsh Posté le 04-09-2004 à 00:59:31    

dac, je vais googleliser un peu sur ca

Reply

Marsh Posté le 04-09-2004 à 01:01:40    

http://cplusplus.com/ref/iostream/
 
les bibliolinks bordel :o

Reply

Marsh Posté le 05-09-2004 à 13:07:16    

j'ai un ti problème que je tente de comprendre
 
donc en gros, j'ai un fichier qui ressemble à ca
 


[ (0, 2
)(2,2 )][(1,
0)(1, 3)]


 
le peu de code que j'ai ressemble à ca
 

Code :
  1. int main () {
  2.   ifstream infile;
  3.   infile.open ("file.data", ifstream::in);
  4.   while (! infile.eof()) {
  5.     char szBuffer = infile.get();
  6.     if (szBuffer != ' ' && szBuffer != '\n') {
  7.       cout << szBuffer;
  8.     }
  9.   }
  10.   infile.close();
  11. }


 
et le résultat c'est ca
 

[(0,2)(2,2)][(1,0)(1,3)]ÿ2


 
ya comme y2 en trop et j'ai aucune idée d'où ca sort


Message édité par burgergold le 05-09-2004 à 13:07:41
Reply

Marsh Posté le 05-09-2004 à 13:41:05    

1) utilise le constructeur et laisse le destructeur fermer le fichier. si c'est un istream, le mode par défaut est in.
2) ton usage de eof est évidemment mauvais

Reply

Marsh Posté le 05-09-2004 à 14:38:34    

ouin... :/
 
jcrois que jvais commencer par tenter de comprendre la différence entre ifstream, iostream et autres stream parce plusieurs me semble pratiquement identique

Reply

Marsh Posté le 05-09-2004 à 15:09:00    

eof -> Check if End-Of-File has been reached.
good -> Check if stream is good for i/o operations. Notice that this function is not the exact opposite of bad()

Reply

Marsh Posté le 05-09-2004 à 15:10:54    

'tain c'est pas compliqué.
 
char c;
while(cin.get(c)) blah;
 
:o

Reply

Marsh Posté le 05-09-2004 à 15:11:22    

et ta notation hongroise de marne est déficient ici.

Reply

Marsh Posté le 05-09-2004 à 15:11:22   

Reply

Marsh Posté le 08-09-2004 à 03:00:05    

si j'ai à lire un truc du genre  
 
[(1.1,2.2)(2.1,3.4)]  
 
bon je lis le caractère [ -> début d'un segment  
le ( -> début des coordonnées d'un point  
y'a moyen de récupéré directement le 1.1 dans un long ou bien je dois lire 1, ensuite ., ensuite 1, et en faire un double?


Message édité par burgergold le 08-09-2004 à 11:36:17
Reply

Marsh Posté le 08-09-2004 à 05:21:13    

comment tu veux mettre "1.1" dans un entier ?

Reply

Marsh Posté le 08-09-2004 à 07:26:57    

Il est 5h21 du matin, et Taz est sur la brèche. Jamais tu dors, toi ? :??:

Reply

Marsh Posté le 08-09-2004 à 07:52:41    

ben là j'ai une semaine de vacances supplémentaire, et je ne fais que travailler/coder depuis dimanche. J'en dors plus (bha ouais je fulmine, j'ai le sommeil léger, dès que j'ouvre l'oeil, je pense à un truc, et je vais le mettre en application. je me suis détester de devoir dormir la nuit de lundi à mardi tellement je voulais finir un truc)

Reply

Marsh Posté le 08-09-2004 à 11:36:35    

Taz a écrit :

comment tu veux mettre "1.1" dans un entier ?


 
arf c'est moi qui dormait à moitié là, double, désolé

Reply

Marsh Posté le 08-09-2004 à 12:33:36    

ben alors lis le ton "1.1"

Reply

Marsh Posté le 10-09-2004 à 13:34:23    

bon j'ai eu quelques minutes pour faire des test hier et j'ai finalement réussi à lire mes trucs, mais de manière plutot bourrin
 
je rappele un exemple de ligne:
[(1.1,2.2)(2.1,3.4)]
 
du genre:
tant que cin.get(c)
  si c == '('
    cin >> double1;
    cin.get(c); // la virgule
    cin >> double2;
    ...
 
jtrouve ca vraiment pas jolie, plutot bourrin et le problème que ca me cause est ce dernier:
 
si au lieu d'avoir une ligne toute bien formatté, j'ai plutot ce genre de truc:
[(1.1    ,2.2)(2.1,3.4)]
 
bin le cin entre le double1 et double2 fera pas ce que j'attends de lui (positionner le pointeur après la virgule)
 
alors jme dis que puisque moi même je trouve le code horrible et bourrin, et taz le trouvera surment 100 fois pire :D, qu'il doit bien avoir des notions qui permettent de lire dans un fichier selon certains pattern
 
sinon j'avais pensé lire le fichier en échappant les espaces et retour de ligne, faire une nouvelle stream et là faire mon traitement, mais encore là ya surement moyen de faire le tout dans 1 passe

Reply

Marsh Posté le 10-09-2004 à 13:43:49    

<istream> -> ws(stream) :o


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 10-09-2004 à 13:45:14    

Masklinn a écrit :

<istream> -> ws(stream) :o


 
 :jap:  
 
ca s'occupe aussi des retours de ligne?
 
selon ce que je suis en train de lire, jcrois pas

Reply

Marsh Posté le 10-09-2004 à 13:48:14    

Tu fais souvent des retours à la ligne dans cin?
 
edit: ah oui a la base ca sort d'un fichier.
 
Ben non je pense pas, mais bon j'ai rarement besoin de ws


Message édité par masklinn le 10-09-2004 à 13:49:58

---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 10-09-2004 à 18:25:55    

Masklinn a écrit :

Tu fais souvent des retours à la ligne dans cin?
 
edit: ah oui a la base ca sort d'un fichier.
 
Ben non je pense pas, mais bon j'ai rarement besoin de ws


 
ouais ca vient d'un fichier, et d'ailleurs ws semble pas marcher pour du ifstream

Reply

Marsh Posté le 10-09-2004 à 18:40:28    

Code :
  1. ifstream iFile("nuage2" );
  2.   if (iFile) {
  3.     char c;
  4.     while (iFile >> c) {
  5.       cout << c;
  6.     }
  7.   }


 
ca semble être ok pour les espaces et les retours de ligne
 
me reste plus qu'à replacer mon code pour récupéré les double

Reply

Marsh Posté le 10-09-2004 à 18:43:30    

Sinon suffit de reprendre ton premier algo et de faire ton controle sur l'eof après la lecture et non avant et comme ca t'auras plus les trucs en trop à la fin ;)

Reply

Marsh Posté le 10-09-2004 à 18:50:37    

Jesus Army a écrit :

Sinon suffit de reprendre ton premier algo et de faire ton controle sur l'eof après la lecture et non avant et comme ca t'auras plus les trucs en trop à la fin ;)


 
jpas sur de te suivre, là j'ai un truc fonctionnel, p-e pas le plus jolie mais c'est la première fois que je travaille avec des stream, alors si vous voyez un moyen de mettre ca moins bourrin
 

Code :
  1. #include <iostream>
  2. #include <fstream>
  3. using namespace std;
  4. int main () {
  5.   ifstream iFile("nuage100" );
  6.   if (iFile) {
  7.     char c;
  8.     while (iFile >> c) {
  9.       if (c == '[') {
  10.         iFile.putback(c);
  11.         double d1, d2, d3, d4;
  12.         /*       [    (          ,          )    (          ,          )    ] */
  13.         iFile >> c >> c >> d1 >> c >> d2 >> c >> c >> d3 >> c >> d4 >> c >> c;
  14.         cout << d1 << ' ' << d2 << ' ' << d3 << ' ' << d4 << endl;
  15.       }
  16.     }
  17.   }
  18.   return 0;
  19. }


 
edit: quelques lignes du fichier pour vous montrer un peu
 


[( 19.2635263 , 25.5134967 )( 90.917141 , 21.4229774 )]
[( 197.740134 , 30.2539732 )( 138.00794 , -12.124489 )]
[( 208.362851 , 69.8908723 )( -11.138168 , 106.479155 )]
[( 46.6417314 , 47.4027743 )( 28.90646 , 56.4996901 )]
[( 187.988485 , 95.987819 )( 126.457309 , -31.974247 )]
[( 80.4705623 , -13.917889 )( 154.303241 , 107.84679 )]
[( 164.398714 , -14.262927 )( 141.696882 , 94.1868516 )]
[( 210.813675 , -28.806513 )( 101.408069 , 24.8595351 )]
[( 18.4501144 , -48.540517 )( 153.085106 , 37.0771329 )]
[( 17.0282718 , 33.2945161 )( 62.2352592 , 16.2383382 )]
[( 18.7795934 , -32.279627 )( 143.13856 , -23.406072 )]
[( 60.0835511 , 96.2339378 )( 201.213961 , 43.5390224 )]
[( 144.540325 , 97.8854257 )( 194.287427 , -10.151088 )]
[( 129.079996 , 9.80599492 )( 68.4239799 , 14.6966485 )]
[( 119.754118 , 62.6373549 )( 107.586576 , -45.292583 )]
[( 90.15884 , 1.66043308 )( -20.119681 , 106.561514 )]
[( -6.208707 , 95.914276 )( 58.8156207 , 28.9673804 )]
[( 195.57083 , -7.9501277 )( 105.149306 , -24.544029 )]
[( 28.0967499 , 25.3077096 )( 29.4470539 , -30.084573 )]
[( 34.4003131 , -49.784706 )( 78.2540075 , -31.52663 )]
[( 83.4722776 , 38.9725929 )( 54.0354425 , 28.3309212 )]
[( 198.982851 , 97.1543 )( 73.8391857 , 56.102572 )]


Message édité par burgergold le 10-09-2004 à 18:51:56
Reply

Marsh Posté le 10-09-2004 à 18:54:30    

en quoi c'est bourrin ?
moi di j'étais toi, je lirais ligne par ligne, après je balancerais tout dans un istringstream, et apres je valide ligne par ligne

Reply

Marsh Posté le 10-09-2004 à 19:04:19    

Taz a écrit :

en quoi c'est bourrin ?
moi di j'étais toi, je lirais ligne par ligne, après je balancerais tout dans un istringstream, et apres je valide ligne par ligne


 
c'est parce que les fichiers de test sont de plus en plus compliqué
 
ex: le premier, 2 lignes, aucun espace
le 2e, 100 lignes, des espaces
le 3e, plein de lignes, parfois des retours de lignes en plein milieu des coordonées d'un segment
 
donc le truc de lire une ligne à la fois je sais pas trop si ca le ferait (mais p-e que je me trompe)
 
pour le truc du bourrin, bin c'est p-e simplement parce que j'suis trop habitué de faire du perl depuis 1an et demi, et qu'un ligne comme ca:
 
iFile >> c >> c >> d1 >> c >> d2 >> c >> c >> d3 >> c >> d4 >> c >> c;
 
jtrouve pas ca nécessairement clair au premier regard, que j'aime pas trop devoir utilisé le c comme variable temporaire pour faire un discard des caractères que j'utilise pas
 
simple période d'adaptation surement

Reply

Marsh Posté le 13-09-2004 à 00:13:38    

autre petite question
 
je ne connais pas le nombre de segment par fichier. Je dois les stocker dans un tableau pour ensuite faire un traitement (vérifier quels sont les segments qui se croisent)
 
vu que je ne connais pas le nombre de segment, je dois donc faire une première passe du fichier, déterminer le nombre de segment, pour ensuite faire une 2e passe, dans laquel pour chaque segment, je déclare mes 2 objets Point, ensuite je déclare mon objet Segment, que je place dans le tableau
 
ou y'a une manière de faire tout ca dynamique (avec les vector par exemple, que je n'ai jamais vu mais qui semble permettre ce genre de traitement)

Reply

Marsh Posté le 13-09-2004 à 01:30:07    

si ça devient trop compliqué, utilise flex / expression régulière et on en parle plus :D

Reply

Marsh Posté le 13-09-2004 à 01:31:44    

Taz a écrit :

si ça devient trop compliqué, utilise flex / expression régulière et on en parle plus :D


 
bah faut que ca reste en C++, c'est pour l'apprentissage quand même

Reply

Marsh Posté le 13-09-2004 à 01:46:10    

bah lis ligne par ligne, après si t'es sur et certains de ton format, tu peux buter tout ce que tu veux, et après faire un simple
 
in >> a >> b >> c >> d
 
ou fais toi simplement une fonction next_number qui fait ce qu'il faut. c'est comme ça que je procède dans libgtop. un char[] et des fonctions de parcours

Reply

Marsh Posté le 13-09-2004 à 02:35:09    

hum la récupération du data élément par élément c'est ok
 
c'est plutot pour placer le tout dans un tableau
 
ex: jai 20 segments, je fais un algo glouton pour tester si le 1er croise le 2e, le 3e, ..., le 20e
ensuite je passe au 2e et je le test avec le 3e, 4e, .. 20e
 
ainsi de suite
 
mais pour déclarer mon tableau de segment, j'ai besoin de connaitre le nombre de segment, alors:
a) je fais une passe qui compte le nombre de segment dans le fichier et une qui va déclarer mon tableau de segment et le remplir
b) j'utilise un truc que je connais pas qui me permettrait d'avoir un "tableau dynamique", ce qui selon ce que j'ai compris, un vector est en mesure d'effectuer

Reply

Marsh Posté le 13-09-2004 à 07:48:15    

vector/queue c'est très bien

Reply

Marsh Posté le 13-09-2004 à 11:40:50    

Taz a écrit :

vector/queue c'est très bien


 
dac c'est un peu ce que je voulais entendre
 
jvais regarder un peu comment ca fonctionne alors

Reply

Marsh Posté le 14-09-2004 à 14:25:50    

bon j'ai appris comment faire pour que l'objet soi capable de se lire lui même mais ca ne semble pas fonctionner
 

Code :
  1. ifstream & operator >> (ifstream &, Point & );
  2. ifstream & operator >> (ifstream &, Segment & );


 

Code :
  1. ifstream & operator >> (ifstream & entree, Point & p) {
  2.   char ch;
  3.   double x, y;
  4.   entree >> ch >> x >> ch >> y >> ch;
  5.   p = Point(x, y);
  6.   return entree;
  7. }
  8. ifstream & operator >> (ifstream & entree, Segment & s) {
  9.   char ch;
  10.   Point p1, p2;
  11.   entree >> ch >> p1 >> p2 >> ch;
  12.   s = Segment(p1, p2);
  13.   return entree;
  14. }


 
mon utilisation
 

Code :
  1. ifstream iFichier("nuage5" );
  2.   vector<Segment> seg_Vector;
  3.   while (iFichier) {
  4.     Segment s;
  5.     iFichier >> s;
  6.     seg_Vector.push_back(s);
  7.   }


 
Le résultat
 


[root@lfs01]# g++ tp1.c
tp1.c: In function `std::ifstream& operator>>(std::ifstream&, Segment& )':
tp1.c:66: error: no match for 'operator>>' in 'std::operator>> [with _CharT = char, _Traits = std::char_traits<char>](((std::basic_istream<char, std::char_traits<char> >& )((std::basic_istream<char, std::char_traits<char> >*)(+entree))), ((char& )(&ch))) >> p1'
/usr/lib/gcc/i686-pc-linux-gnu/3.4.1/../../../../include/c++/3.4.1/bits/istream.tcc:87: note: candidates are: std::basic_istream<_CharT, _Traits>& std::basic_istream<_CharT, _Traits>::operator>>(std::basic_istream<_CharT, _Traits>&(*)(std::basic_istream<_CharT, _Traits>& )) [with _CharT = char, _Traits = std::char_traits<char>]
/usr/lib/gcc/i686-pc-linux-gnu/3.4.1/../../../../include/c++/3.4.1/bits/istream.tcc:93: note:                 std::basic_istream<_CharT, _Traits>& std::basic_istream<_CharT, _Traits>::operator>>(std::basic_ios<_CharT, _Traits>&(*)(std::basic_ios<_CharT, _Traits>& )) [with _CharT = char, _Traits = std::char_traits<char>]
/usr/lib/gcc/i686-pc-linux-gnu/3.4.1/../../../../include/c++/3.4.1/bits/istream.tcc:102: note:                 std::basic_istream<_CharT, _Traits>& std::basic_istream<_CharT, _Traits>::operator>>(std::ios_base&(*)(std::ios_base& )) [with _CharT = char, _Traits = std::char_traits<char>]
/usr/lib/gcc/i686-pc-linux-gnu/3.4.1/../../../../include/c++/3.4.1/bits/istream.tcc:111: note:                 std::basic_istream<_CharT, _Traits>& std::basic_istream<_CharT, _Traits>::operator>>(bool& ) [with _CharT = char, _Traits = std::char_traits<char>]
/usr/lib/gcc/i686-pc-linux-gnu/3.4.1/../../../../include/c++/3.4.1/bits/istream.tcc:133: note:                 std::basic_istream<_CharT, _Traits>& std::basic_istream<_CharT, _Traits>::operator>>(short int& ) [with _CharT = char, _Traits = std::char_traits<char>]
/usr/lib/gcc/i686-pc-linux-gnu/3.4.1/../../../../include/c++/3.4.1/bits/istream.tcc:164: note:                 std::basic_istream<_CharT, _Traits>& std::basic_istream<_CharT, _Traits>::operator>>(short unsigned int& ) [with _CharT = char, _Traits = std::char_traits<char>]
/usr/lib/gcc/i686-pc-linux-gnu/3.4.1/../../../../include/c++/3.4.1/bits/istream.tcc:186: note:                 std::basic_istream<_CharT, _Traits>& std::basic_istream<_CharT, _Traits>::operator>>(int& ) [with _CharT = char, _Traits = std::char_traits<char>]
/usr/lib/gcc/i686-pc-linux-gnu/3.4.1/../../../../include/c++/3.4.1/bits/istream.tcc:217: note:                 std::basic_istream<_CharT, _Traits>& std::basic_istream<_CharT, _Traits>::operator>>(unsigned int& ) [with _CharT = char, _Traits = std::char_traits<char>]
/usr/lib/gcc/i686-pc-linux-gnu/3.4.1/../../../../include/c++/3.4.1/bits/istream.tcc:239: note:                 std::basic_istream<_CharT, _Traits>& std::basic_istream<_CharT, _Traits>::operator>>(long int& ) [with _CharT = char, _Traits = std::char_traits<char>]
/usr/lib/gcc/i686-pc-linux-gnu/3.4.1/../../../../include/c++/3.4.1/bits/istream.tcc:261: note:                 std::basic_istream<_CharT, _Traits>& std::basic_istream<_CharT, _Traits>::operator>>(long unsigned int& ) [with _CharT = char, _Traits = std::char_traits<char>]
/usr/lib/gcc/i686-pc-linux-gnu/3.4.1/../../../../include/c++/3.4.1/bits/istream.tcc:284: note:                 std::basic_istream<_CharT, _Traits>& std::basic_istream<_CharT, _Traits>::operator>>(long long int& ) [with _CharT = char, _Traits = std::char_traits<char>]
/usr/lib/gcc/i686-pc-linux-gnu/3.4.1/../../../../include/c++/3.4.1/bits/istream.tcc:306: note:                 std::basic_istream<_CharT, _Traits>& std::basic_istream<_CharT, _Traits>::operator>>(long long unsigned int& ) [with _CharT = char, _Traits = std::char_traits<char>]
/usr/lib/gcc/i686-pc-linux-gnu/3.4.1/../../../../include/c++/3.4.1/bits/istream.tcc:329: note:                 std::basic_istream<_CharT, _Traits>& std::basic_istream<_CharT, _Traits>::operator>>(float& ) [with _CharT = char, _Traits = std::char_traits<char>]
/usr/lib/gcc/i686-pc-linux-gnu/3.4.1/../../../../include/c++/3.4.1/bits/istream.tcc:351: note:                 std::basic_istream<_CharT, _Traits>& std::basic_istream<_CharT, _Traits>::operator>>(double& ) [with _CharT = char, _Traits = std::char_traits<char>]
/usr/lib/gcc/i686-pc-linux-gnu/3.4.1/../../../../include/c++/3.4.1/bits/istream.tcc:373: note:                 std::basic_istream<_CharT, _Traits>& std::basic_istream<_CharT, _Traits>::operator>>(long double& ) [with _CharT = char, _Traits = std::char_traits<char>]
/usr/lib/gcc/i686-pc-linux-gnu/3.4.1/../../../../include/c++/3.4.1/bits/istream.tcc:395: note:                 std::basic_istream<_CharT, _Traits>& std::basic_istream<_CharT, _Traits>::operator>>(void*& ) [with _CharT = char, _Traits = std::char_traits<char>]
/usr/lib/gcc/i686-pc-linux-gnu/3.4.1/../../../../include/c++/3.4.1/bits/istream.tcc:417: note:                 std::basic_istream<_CharT, _Traits>& std::basic_istream<_CharT, _Traits>::operator>>(std::basic_streambuf<_CharT, _Traits>*) [with _CharT = char, _Traits = std::char_traits<char>]
tp1.c:52: note:                 std::ifstream& operator>>(std::ifstream&, Point& )
tp1.c:62: note:                 std::ifstream& operator>>(std::ifstream&, Segment& )
/usr/lib/gcc/i686-pc-linux-gnu/3.4.1/../../../../include/c++/3.4.1/istream:692: note:                 std::basic_istream<char, _Traits>& std::operator>>(std::basic_istream<char, _Traits>&, signed char*) [with _Traits = std::char_traits<char>]
/usr/lib/gcc/i686-pc-linux-gnu/3.4.1/../../../../include/c++/3.4.1/istream:687: note:                 std::basic_istream<char, _Traits>& std::operator>>(std::basic_istream<char, _Traits>&, unsigned char*) [with _Traits = std::char_traits<char>]
/usr/lib/gcc/i686-pc-linux-gnu/3.4.1/../../../../include/c++/3.4.1/istream:651: note:                 std::basic_istream<char, _Traits>& std::operator>>(std::basic_istream<char, _Traits>&, signed char& ) [with _Traits = std::char_traits<char>]
/usr/lib/gcc/i686-pc-linux-gnu/3.4.1/../../../../include/c++/3.4.1/istream:646: note:                 std::basic_istream<char, _Traits>& std::operator>>(std::basic_istream<char, _Traits>&, unsigned char& ) [with _Traits = std::char_traits<char>]


 
pourtant j'avais cru comprendre que le ifstream, s'il trouvait pas dans sa lib comment lire l'objet Segment ou Point, qu'il regarderait pour un prototype dans mon code, hors ca semble pas le cas :/
 
 

Reply

Marsh Posté le 14-09-2004 à 16:21:41    

J'ai la flemme de t'expliquer pourquoi (un autre le fera...).
Mais remplace tes ifstream par des istream.
 
Edit: Pas dans la déclaration du fichier, bien sûr. Fais le juste au niveau de la déclaration de tes opérateurs surchargés.


Message édité par Lam's le 14-09-2004 à 16:22:34
Reply

Marsh Posté le 15-09-2004 à 00:01:31    

Lam's a écrit :

J'ai la flemme de t'expliquer pourquoi (un autre le fera...).
Mais remplace tes ifstream par des istream.
 
Edit: Pas dans la déclaration du fichier, bien sûr. Fais le juste au niveau de la déclaration de tes opérateurs surchargés.


 
ok
 
maintenant quelqu'un qui m'explique le pourquoi? :D

Reply

Marsh Posté le 15-09-2004 à 15:03:59    

Burgergold a écrit :

ok
 
maintenant quelqu'un qui m'explique le pourquoi? :D


 
Tu as essayé de demander à Bjarne Stroustrup ? aux Deitel ? Herb Sutter ? Scott Meyers ?  
 
Sinon,
 

Code :
  1. ifstream f;
  2. std::string s;
  3. Point point;
  4. f >> s >> point;
  5. //est équivalent à :
  6. (f.vomit(s)).vomit(point);
  7. // équivalent à :
  8. istream & i = f.vomit(s);
  9. i.vomit(point);
  10. // sachant que vomit() retourne un istream lors de son 1er appel.


 
Dès que tu as transféré ton flux vers ta chaîne s, le type du flux en cours est "perdu" : ce n'est plus un ifstream, mais juste un istream (sa classe de base).  
 
Il faut donc que tu sois capable de travailler sur un istream, sinon le compilateur ne saura pas comment effectuer l'opération:

Code :
  1. operator >> (istream & i, Point & p);


Reply

Marsh Posté le 15-09-2004 à 15:07:50    

Lam's a écrit :

Tu as essayé de demander à Bjarne Stroustrup ? aux Deitel ? Herb Sutter ? Scott Meyers ?
 
Sinon,
 

Code :
  1. ifstream f;
  2. std::string s;
  3. Point point;
  4. f >> s >> point;
  5. //est équivalent à :
  6. (f.vomit(s)).vomit(point);
  7. // équivalent à :
  8. istream & i = f.vomit(s);
  9. i.vomit(point);
  10. // sachant que vomit() retourne un istream lors de son 1er appel.


 
Dès que tu as transféré ton flux vers ta chaîne s, le type du flux en cours est "perdu" : ce n'est plus un ifstream, mais juste un istream (sa classe de base).  
 
Il faut donc que tu sois capable de travailler sur un istream, sinon le compilateur ne saura pas comment effectuer l'opération:

Code :
  1. operator >> (istream & i, Point & p);




 
bin à vrai dire la dernière fois qu'on s'est parlé ca s'est mal fini, alors j'préfère les éviter :D (à vrai dire, jai aucune idée de qui tu parles :D)
 
mais merci pour l'explication

Reply

Marsh Posté le 17-09-2004 à 04:49:42    

si dans le fichier, je veux dabord compter le nombre de segment, ensuite me déclarer un tableau, et relire ce fichier pour remplir le tableau, jsuis obligé de faire 2 accès au fichier où ya moyen de copier mon ifstream dans une autre stream réutilisable pour ma 2e boucle? (en espérant que ca soit un peu plus rapide)

Reply

Marsh Posté le 17-09-2004 à 08:15:23    

Burgergold a écrit :

bin à vrai dire la dernière fois qu'on s'est parlé ca s'est mal fini, alors j'préfère les éviter :D (à vrai dire, jai aucune idée de qui tu parles :D)
 
mais merci pour l'explication


 
Des grands gourous du C++.
Stroustrup : créateur du langage.
Herb Sutter : http://www.gotw.ca/gotw/
Scott Meyers : "Effective C++", "More Effective C++"
 
Pour ta question, je ne sais pas. Moi, j'essaierais de copier le stream directement dans une structure que j'agrandis au fur et à mesure (donc pas un vector si possible) par a coups (de 10 ou 100 ko) -> pas de 2e passe.


Message édité par el muchacho le 17-09-2004 à 08:27:16
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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