getline sous Windows-gcc 3.4.2

getline sous Windows-gcc 3.4.2 - C++ - Programmation

Marsh Posté le 02-03-2006 à 07:40:08    

quelqu'un a-t'il déjà travaillé avec :
istream& getline( istream& is, string& s, char delimiter = '\n' );
sous Windows - gcc
 
il me fait des truc tres bizarre, genre ca marche dans 95% des cas et puis sur certaine ligne il se plante
 
je pense que ca plante au niveau des <CR><LF> du DOS contre les simples <LF> de UNIX/LINUX
 
une idée ? un bon code pour remplacer getline ?
 
pour l'instant j'ajoute :

Code :
  1. std::ifstream f_ptx_in(nomficptx.c_str (), ios::in | ios::binary);
  2.         std::string::size_type index = nomficptx.find("." );
  3.         std::string nomficptxout = nomficptx.substr( 0, index) + "_temp.ptx";
  4.    std::ofstream f_ptx_out(nomficptxout.c_str(), ios::out | ios::binary);
  5.    
  6. char temp[1048576];
  7. unsigned int index_temp = 0;
  8.         char tampon;
  9.         while ( f_ptx_out && f_ptx_in.get(tampon) )
  10.         {
  11.            if (tampon!='\r')
  12.            {
  13.                temp[index_temp] = tampon;
  14.                index_temp++;
  15.            }
  16.            if (index_temp == 1048576)
  17.            {
  18.                f_ptx_out.write (temp, index_temp);
  19.                index_temp = 0;
  20.            }
  21.         }
  22.         f_ptx_out.write (temp, index_temp);
  23.        
  24.    
  25.         f_ptx_out.close();
  26.         f_ptx_bin.close();
  27.    
  28.         int result = remove(nomficptx.c_str ());
  29.         if (result != 0 )
  30.         {
  31.             perror( "Error renaming file" );
  32.             system("pause" );
  33.         }
  34.         rename(nomficptxout.c_str(), nomficptx.c_str ());


 
mais ca me fait perdre 5min sur le traitement d'un fichier de 150Mo :-(

Reply

Marsh Posté le 02-03-2006 à 07:40:08   

Reply

Marsh Posté le 02-03-2006 à 08:22:02    

donne ton code original.

Reply

Marsh Posté le 02-03-2006 à 08:30:52    

Taz a écrit :

donne ton code original.


 

Code :
  1. std::ifstream f_ptx(nomficptx.c_str (), ios::in);
  2. if(f_ptx.fail())
  3.         {
  4.           cerr << "Erreur d'ouverture du fichier PTX : " << nomficptx << endl;
  5.           system("pause" );
  6.           exit(0);
  7.         }       
  8.         std::string::size_type index = nomficptx.find("." );
  9.        
  10.         std::string nomficlogout = nomficptx.substr( 0, index) + "_ptx.log";       
  11.     std::ofstream f_out(nomficlogout.c_str (), ios::out);
  12.        
  13.         f_out << fixed;
  14.        
  15.         SCANWORLD::ScanWorld SWtemp;
  16.         SCANWORLD::Scan Sctemp;
  17.        
  18.         f_ptx >> Sctemp.NbL;
  19.         while (!f_ptx.eof())
  20.         {
  21.             f_out << Sctemp.NbL << std::endl;
  22.             f_ptx >> Sctemp.NbC;
  23.            
  24.             f_ptx >> SWtemp.Xp >> SWtemp.Yp >> SWtemp.Zp;
  25.            
  26.             boost::numeric::ublas::matrix<double> Rtemp (3, 3);
  27.            
  28.             f_ptx >> Rtemp (0, 0) >> Rtemp (0, 1) >> Rtemp (0, 2);
  29.             f_ptx >> Rtemp (1, 0) >> Rtemp (1, 1) >> Rtemp (1, 2);
  30.             f_ptx >> Rtemp (2, 0) >> Rtemp (2, 1) >> Rtemp (2, 2);
  31.            
  32.             SWtemp.R.SetR (Rtemp);
  33.            
  34.             std::string ligne;
  35.             std::getline(f_ptx, ligne); // fin de la dernière ligne matrice R
  36.             std::getline(f_ptx, ligne);
  37.             std::getline(f_ptx, ligne);
  38.             std::getline(f_ptx, ligne);
  39.             std::getline(f_ptx, ligne);
  40.              
  41.             Sctemp.PosBegin = f_ptx.tellg ();
  42.            
  43.             f_out << Sctemp.NbPts () << "\n";
  44.            
  45.             for (unsigned int i=0; i<Sctemp.NbPts (); i++) std::getline(f_ptx, ligne);
  46.            
  47.             f_out << "fin scan \n";
  48.             f_ptx >> Sctemp.NbL;
  49.         }
  50.                                                                
  51.         f_out.close();       
  52.         f_ptx.close();


 
 
voila le code, j'ai enlevé du code qui n'a rien a voir avec le probleme pour simplifier, donc c'est normal que ce code ne semble rien faire d'interressant

Reply

Marsh Posté le 02-03-2006 à 08:46:54    

#
while (!f_ptx.eof())
#
       {
 
 
mauvais. ne fonctionne pas comme tu penses, verifie les retour des toutes tes fonctions de lecture.

Reply

Marsh Posté le 02-03-2006 à 08:47:53    

je crois que  
 
Sctemp.PosBegin = f_ptx.tellg ();
 
fout le bordel !!!
 
est il compatible avec un fichier ouvert en mode non binaire ?

Reply

Marsh Posté le 02-03-2006 à 08:51:48    

Taz a écrit :

#
while (!f_ptx.eof())
#
       {
 
 
mauvais. ne fonctionne pas comme tu penses, verifie les retour des toutes tes fonctions de lecture.


 
 
pourquoi ?
 
en fait le dernier element du while :
 
f_ptx >> Sctemp.NbL;
 
doit placer f_ptx en statut eof car :
- mon fichier en lecture est constitué d'une suite de "Scan"
- dans le while je lis un scan
- et ensuite le premier element du scan suivant f_ptx >> Sctemp.NbL;
- si donc il n'y a pas d'element suivant f_ptx >> Sctemp.NbL; ne trouve rien de valable à lire et donc place le flag eof sur f_ptx
 
non ?

Reply

Marsh Posté le 02-03-2006 à 08:53:48    

Taz a écrit :

#
while (!f_ptx.eof())
#
       {
 
 
mauvais. ne fonctionne pas comme tu penses, verifie les retour des toutes tes fonctions de lecture.


 
 
j'ai verifier les retours (enfin en partie car le fichiers est gros)
 
sytematiquement apres Sctemp.PosBegin = f_ptx.tellg ();  
 
une partie de la ligne lue est boufée !
 
genre  
 
au lieu de la ligne  
 -11.274033 15.741867 5.578140 0.481239 54 48 52
je retrouve la ligne
274033 15.741867 5.578140 0.481239 54 48 52

Reply

Marsh Posté le 02-03-2006 à 10:54:36    

ddesbuis a écrit :

pourquoi ?
 
en fait le dernier element du while :
 
f_ptx >> Sctemp.NbL;
 
doit placer f_ptx en statut eof car :
- mon fichier en lecture est constitué d'une suite de "Scan"
- dans le while je lis un scan
- et ensuite le premier element du scan suivant f_ptx >> Sctemp.NbL;
- si donc il n'y a pas d'element suivant f_ptx >> Sctemp.NbL; ne trouve rien de valable à lire et donc place le flag eof sur f_ptx
 
non ?


 
li la doc sur eof plutot que de lui inventer un comportement quoi n'est pas le sien

Reply

Marsh Posté le 02-03-2006 à 11:12:25    

skelter a écrit :

li la doc sur eof plutot que de lui inventer un comportement quoi n'est pas le sien


 
ce que j'aime sur ce forum c'est les gars trop cool qui y traine !!!
 
genre ca t'ecorcherai le clavier de me donner une reponse...
 
si c'est pour me sortir de lire la doc ... merci c'est déjà fait  
 
chao man

Reply

Marsh Posté le 02-03-2006 à 11:44:09    

je peux pas t'expliquer car je connais pas ca par coeur, je peux juste te dire que l'utilisation est mauvaise car eof indique juste si la précédente erreur de lecture est causer par la fin du fichier
quand je dis d'aller voir la doc c'est parce que c'est (quand meme) pas a moi d'aller voir pour ensuite t'expliquer, tu veux que je te fasses la lecture ou quoi ?

Reply

Marsh Posté le 02-03-2006 à 11:44:09   

Reply

Marsh Posté le 02-03-2006 à 13:38:15    

skelter a écrit :

je peux pas t'expliquer car je connais pas ca par coeur, je peux juste te dire que l'utilisation est mauvaise car eof indique juste si la précédente erreur de lecture est causer par la fin du fichier
quand je dis d'aller voir la doc c'est parce que c'est (quand meme) pas a moi d'aller voir pour ensuite t'expliquer, tu veux que je te fasses la lecture ou quoi ?


 
de toute facon le probleme soulevé ici n'est pas la mais dans l'usage de getline()

Reply

Marsh Posté le 02-03-2006 à 16:05:34    

peut être pas. mais si tu n'es pas certain que ta lecture de données s'est bien passé, ce n'est pas la peine de réfléchir si le traitement est correct ou pas.

Reply

Marsh Posté le 02-03-2006 à 17:00:18    

Taz a écrit :

peut être pas. mais si tu n'es pas certain que ta lecture de données s'est bien passé, ce n'est pas la peine de réfléchir si le traitement est correct ou pas.


 
mais je sais que la lecture marche , je verifie via un fichier log qui jete tous ce que je li dedans
 
par contre je constate que quand j'utilise f_ptx.tellg ();  
 
la ligne que j'extrait juste apres et escamotée
 
donc faite moi confiance le pb n'est pas sur le eof mais ailleurs dans la boucle while !!!
 
maintenat si quelqu'un me dit par quoi et pourquoi remplacé le eof why not je suis prenneur mais perso ca me va comme c'est maintenant
 
yop

Reply

Marsh Posté le 09-03-2006 à 11:43:15    

ddesbuis a écrit :

mais je sais que la lecture marche
[...]
maintenat si quelqu'un me dit par quoi et pourquoi remplacé le eof


la preuve que non. si tu utilises eof comme ça, c'est justement que tu ne vérifies aucune lecture.

Reply

Sujets relatifs:

Leave a Replay

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