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

  FORUM HardWare.fr
  Programmation
  C++

  getline sous Windows-gcc 3.4.2

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

getline sous Windows-gcc 3.4.2

n°1316698
ddesbuis
Posté le 02-03-2006 à 07:40:08  profilanswer
 

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

mood
Publicité
Posté le 02-03-2006 à 07:40:08  profilanswer
 

n°1316700
Taz
bisounours-codeur
Posté le 02-03-2006 à 08:22:02  profilanswer
 

donne ton code original.

n°1316702
ddesbuis
Posté le 02-03-2006 à 08:30:52  profilanswer
 

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

n°1316707
Taz
bisounours-codeur
Posté le 02-03-2006 à 08:46:54  profilanswer
 

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

n°1316709
ddesbuis
Posté le 02-03-2006 à 08:47:53  profilanswer
 

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

n°1316711
ddesbuis
Posté le 02-03-2006 à 08:51:48  profilanswer
 

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 ?

n°1316713
ddesbuis
Posté le 02-03-2006 à 08:53:48  profilanswer
 

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

n°1316781
skelter
Posté le 02-03-2006 à 10:54:36  profilanswer
 

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

n°1316795
ddesbuis
Posté le 02-03-2006 à 11:12:25  profilanswer
 

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

n°1316831
skelter
Posté le 02-03-2006 à 11:44:09  profilanswer
 

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 ?

mood
Publicité
Posté le 02-03-2006 à 11:44:09  profilanswer
 

n°1316933
ddesbuis
Posté le 02-03-2006 à 13:38:15  profilanswer
 

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

n°1317100
Taz
bisounours-codeur
Posté le 02-03-2006 à 16:05:34  profilanswer
 

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.

n°1317182
ddesbuis
Posté le 02-03-2006 à 17:00:18  profilanswer
 

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

n°1321678
Taz
bisounours-codeur
Posté le 09-03-2006 à 11:43:15  profilanswer
 

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.


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

  getline sous Windows-gcc 3.4.2

 

Sujets relatifs
getline (fstream) ne recupere que le 1er Ko1[C] quelle incidence des mot-clés NEAR et FAR sous windows?
[VBScript] Livre Scripting orienté administration WindowsSavez-vous où windows enregistre le fichier de calibrage d'un volant?
Lister les DSN (odbc) dispo sous windows en PHPRécupérer des infos d'un terminal server sous windows 2000 Server en p
Copie de répertoire avec if avec un serveur sous Windows 2000 ServeurModifier un service windows en batch
Programme linux sous windowsOuverture de fichier sous windows
Plus de sujets relatifs à : getline sous Windows-gcc 3.4.2


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