Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1513 connectés 

  FORUM HardWare.fr
  Programmation
  C++

  [C++] Lecture de fichier

 


 Mot :   Pseudo :  
 
 Page :   1  2
Page Précédente
Auteur Sujet :

[C++] Lecture de fichier

n°841936
burgergold
5$? va chez l'diable!
Posté le 04-09-2004 à 00:57:20  profilanswer
 

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

mood
Publicité
Posté le 04-09-2004 à 00:57:20  profilanswer
 

n°841938
chrisbk
-
Posté le 04-09-2004 à 00:58:03  profilanswer
 

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

n°841939
burgergold
5$? va chez l'diable!
Posté le 04-09-2004 à 00:59:31  profilanswer
 

dac, je vais googleliser un peu sur ca

n°841941
Taz
bisounours-codeur
Posté le 04-09-2004 à 01:01:40  profilanswer
 

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

n°842727
burgergold
5$? va chez l'diable!
Posté le 05-09-2004 à 13:07:16  profilanswer
 

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
n°842748
Taz
bisounours-codeur
Posté le 05-09-2004 à 13:41:05  profilanswer
 

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

n°842767
burgergold
5$? va chez l'diable!
Posté le 05-09-2004 à 14:38:34  profilanswer
 

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

n°842777
cris56
Posté le 05-09-2004 à 15:09:00  profilanswer
 

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()

n°842779
Taz
bisounours-codeur
Posté le 05-09-2004 à 15:10:54  profilanswer
 

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

n°842780
Taz
bisounours-codeur
Posté le 05-09-2004 à 15:11:22  profilanswer
 

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

mood
Publicité
Posté le 05-09-2004 à 15:11:22  profilanswer
 

n°844711
burgergold
5$? va chez l'diable!
Posté le 08-09-2004 à 03:00:05  profilanswer
 

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
n°844712
Taz
bisounours-codeur
Posté le 08-09-2004 à 05:21:13  profilanswer
 

comment tu veux mettre "1.1" dans un entier ?

n°844718
el muchach​o
Comfortably Numb
Posté le 08-09-2004 à 07:26:57  profilanswer
 

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

n°844720
Taz
bisounours-codeur
Posté le 08-09-2004 à 07:52:41  profilanswer
 

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)

n°844900
burgergold
5$? va chez l'diable!
Posté le 08-09-2004 à 11:36:35  profilanswer
 

Taz a écrit :

comment tu veux mettre "1.1" dans un entier ?


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

n°844934
Taz
bisounours-codeur
Posté le 08-09-2004 à 12:33:36  profilanswer
 

ben alors lis le ton "1.1"

n°846871
burgergold
5$? va chez l'diable!
Posté le 10-09-2004 à 13:34:23  profilanswer
 

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

n°846878
masklinn
í dag viðrar vel til loftárása
Posté le 10-09-2004 à 13:43:49  profilanswer
 

<istream> -> ws(stream) :o


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
n°846880
burgergold
5$? va chez l'diable!
Posté le 10-09-2004 à 13:45:14  profilanswer
 

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

n°846884
masklinn
í dag viðrar vel til loftárása
Posté le 10-09-2004 à 13:48:14  profilanswer
 

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
n°847233
burgergold
5$? va chez l'diable!
Posté le 10-09-2004 à 18:25:55  profilanswer
 

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

n°847241
burgergold
5$? va chez l'diable!
Posté le 10-09-2004 à 18:40:28  profilanswer
 

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

n°847246
Jesus Army
Allez voir là bas si j'y suis
Posté le 10-09-2004 à 18:43:30  profilanswer
 

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 ;)

n°847254
burgergold
5$? va chez l'diable!
Posté le 10-09-2004 à 18:50:37  profilanswer
 

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
n°847258
Taz
bisounours-codeur
Posté le 10-09-2004 à 18:54:30  profilanswer
 

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

n°847264
burgergold
5$? va chez l'diable!
Posté le 10-09-2004 à 19:04:19  profilanswer
 

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

n°848274
burgergold
5$? va chez l'diable!
Posté le 13-09-2004 à 00:13:38  profilanswer
 

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)

n°848280
Taz
bisounours-codeur
Posté le 13-09-2004 à 01:30:07  profilanswer
 

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

n°848281
burgergold
5$? va chez l'diable!
Posté le 13-09-2004 à 01:31:44  profilanswer
 

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

n°848282
Taz
bisounours-codeur
Posté le 13-09-2004 à 01:46:10  profilanswer
 

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

n°848288
burgergold
5$? va chez l'diable!
Posté le 13-09-2004 à 02:35:09  profilanswer
 

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

n°848305
Taz
bisounours-codeur
Posté le 13-09-2004 à 07:48:15  profilanswer
 

vector/queue c'est très bien

n°848541
burgergold
5$? va chez l'diable!
Posté le 13-09-2004 à 11:40:50  profilanswer
 

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

n°849943
burgergold
5$? va chez l'diable!
Posté le 14-09-2004 à 14:25:50  profilanswer
 

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 :/
 
 

n°850070
Lam's
Profil: bas.
Posté le 14-09-2004 à 16:21:41  profilanswer
 

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
n°850400
burgergold
5$? va chez l'diable!
Posté le 15-09-2004 à 00:01:31  profilanswer
 

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

n°850790
Lam's
Profil: bas.
Posté le 15-09-2004 à 15:03:59  profilanswer
 

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);


n°850792
burgergold
5$? va chez l'diable!
Posté le 15-09-2004 à 15:07:50  profilanswer
 

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

n°852348
burgergold
5$? va chez l'diable!
Posté le 17-09-2004 à 04:49:42  profilanswer
 

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)

n°852363
el muchach​o
Comfortably Numb
Posté le 17-09-2004 à 08:15:23  profilanswer
 

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
mood
Publicité
Posté le   profilanswer
 

 Page :   1  2
Page Précédente

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

  [C++] Lecture de fichier

 

Sujets relatifs
Ecrire dans un fichier déjà existant sans écraser le contenu précédent[VBS] copie de fichier anterieur a 7 jours.
Ecrire dans un fichier dans un répertoire paramétrableFichier texte et retour à la ligne
[Batch] Modifier le fichier host ?[Javascript] Input File - Griser le textfield / Test sur le fichier
[java] modification fichier texteLecture tableau associatif complexe
[VISUAL C++] Le fichier MonAppli.rc peut-il être divisé.[C] : écriture dans un fichier linux
Plus de sujets relatifs à : [C++] Lecture de fichier


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR