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

  FORUM HardWare.fr
  Programmation
  C++

  [Résolu] Ifstream et commentaires

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[Résolu] Ifstream et commentaires

n°1506017
SkippyleGr​andGourou
Posté le 22-01-2007 à 18:21:07  profilanswer
 

Salut,
 
J'ai à lire un fichier de données contenant des colonnes d'entiers. Je voudrais également gérer la présence de commentaires précédés d'un dièse. Voilà mon code, qui fonctionne bien, mais souffre d'un léger bug que je n'arrive pas à déterminer :

Code :
  1. int data[3];
  2. char head[2];
  3. ifstream fichier;
  4. fichier.open("mon_fichier",ios::in);
  5. while(1)
  6. {
  7.  fichier.read(head,2);
  8.   if(head[0]=='#' || head[1]=='#') { cout<<"bouh!"<<endl; fichier.ignore(256,'\n'); }
  9.  else { fichier.unget(); fichier.unget(); }
  10.  fichier >> data[0] >> data[1] >> data[2];
  11.  if(fichier.eof()) break;
  12.  cout<<data[0]<<" "<<data[1]<<" "<<data[2]<<endl;
  13. }


 
Le bug : s'il y a deux lignes de commentaires à la suite, l'affichage boucle sur la ligne précédent le premier commentaire...
 
Une idée ?
 
Merci.


Message édité par SkippyleGrandGourou le 22-01-2007 à 18:44:48
mood
Publicité
Posté le 22-01-2007 à 18:21:07  profilanswer
 

n°1506023
SkippyleGr​andGourou
Posté le 22-01-2007 à 18:40:51  profilanswer
 

Bon, on va mettre ça sur le compte de la fatigue... Manquait juste un petit "continue" (du coup plus besoin du "else" ) :

Code :
  1. int data[3];
  2. char head[2];
  3. ifstream fichier;
  4. fichier.open("mapping",ios::in);
  5. while(1)
  6. {
  7.  fichier.read(t,2);
  8.   if(head[0]=='#' || head[1]=='#')
  9.   {
  10.    cout<<"bouh!"<<endl;
  11.    fichier.ignore(256,'\n');
  12.    continue;
  13.   }
  14.  fichier.unget();
  15.  fichier.unget();
  16.  fichier >> data[0] >> data[1] >> data[2];}
  17.  if(fichier.eof()) break;
  18.  cout<<data[0]<<" "<<data[1]<<" "<<data[2]<<endl;
  19. }


Message édité par SkippyleGrandGourou le 22-01-2007 à 18:42:16
n°1506213
Taz
bisounours-codeur
Posté le 23-01-2007 à 10:27:02  profilanswer
 

oh des moches char* ...
un moche eof

n°1506362
SkippyleGr​andGourou
Posté le 23-01-2007 à 14:57:06  profilanswer
 

Te gêne pas pour proposer si t'as plus élégant, c'est pas interdit, je t'autorise...  ;)  
 
Je pourrais bien remplacer le read(char*) par deux (char)=get(), mais je trouve ça encore plus moche d'écrire deux fois la même ligne (d'ailleurs je vais peut-être remplacer le double unget() par file.seekg((int)file.tellg()-2), c'est sans doute pas plus propre mais ça m'écorche moins les yeux... j'hésite encore)... Pis c'est quand même pas ma faute si les développeurs d'ios utilisent encore les char*...  :sarcastic:  
 
Pour le eof, c'est pareil, qu'est-ce que t'utilise à la place ? Il est bien placé, il dérange personne et il est défini dans ios...


Message édité par SkippyleGrandGourou le 23-01-2007 à 15:00:18
n°1506396
Taz
bisounours-codeur
Posté le 23-01-2007 à 16:00:11  profilanswer
 

while (std::getline(std::cin, line)) {
i = line.find_first_not_of(" \t" )
if (i != std::string::npos and *i == '#')
  comment = true;
}

n°1506481
SkippyleGr​andGourou
Posté le 23-01-2007 à 20:36:54  profilanswer
 

Bien vu, c'est clair que c'est plus propre. Le nouveau code :
 

Code :
  1. ifstream file;
  2. file.open("mapping",ios::in);
  3. string line;
  4. while (getline(file, line))
  5. {
  6.  if (line.find_first_not_of(" \t\n" )==string::npos || line.find('#') != string::npos) continue;
  7.  istringstream ostr(line);
  8.  ostr>>a[0]>>a[1]>>a[2];
  9.  cout<<a[0]<<" "<<a[1]<<" "<<a[2]<<endl;
  10. }


Message édité par SkippyleGrandGourou le 23-01-2007 à 20:37:32
n°1506589
Taz
bisounours-codeur
Posté le 24-01-2007 à 09:15:27  profilanswer
 

non c'est faux.

n°1506683
SkippyleGr​andGourou
Posté le 24-01-2007 à 11:55:26  profilanswer
 

Qu'est-ce qui est faux, ta proposition n'est pas plus propre ? :P Si tu parles du fait qu'il zappe toute la ligne même si le commetaire est à la fin, c'est volontaire : je ne veux pas de commentaires en fin de ligne (remarque, ce serait peut-être plus drôle de faire planter carrément le truc...).


Message édité par SkippyleGrandGourou le 24-01-2007 à 11:56:50
n°1506745
Taz
bisounours-codeur
Posté le 24-01-2007 à 13:36:26  profilanswer
 

non c'est faux parce que tu zappes la moindre ligne ne contenant pas d'espace ou contenant un #. C'est pas ma faute si tu ne sais pas recopier, mon code correspond à ta demande.

n°1506774
SkippyleGr​andGourou
Posté le 24-01-2007 à 14:17:45  profilanswer
 

Bah c'est voulu,  les lignes vides non commentées ont tendance à être pratiques, mais doivent être considérées comme un commentaire sinon je reprend les données de la ligne précédente... Idem si le # est en plein milieu de la ligne, si le gars qui rempli le fichier a la polio, c'est pas une raison pour faire planter tout le code...
 
Et pis si je recopie ton code sans réfléchir, le compilo va gueuler que les variables osnt pas déclarées, qu'il manque de la ponctuation et qu'il peut pas comparer un pointeur sur une position avec un caractère... :P

mood
Publicité
Posté le 24-01-2007 à 14:17:45  profilanswer
 

n°1506809
Taz
bisounours-codeur
Posté le 24-01-2007 à 15:15:54  profilanswer
 

laisse tomber


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

  [Résolu] Ifstream et commentaires

 

Sujets relatifs
[RESOLU]Checkbox[xsl] sélection de noeuds selon leurs attrituts [Résolu]
[Resolu] jouer son au bout de t secondes[PHP & XMLReader] Ne passe pas dans les noeuds Attributs [Resolu]
[Résolu] [Visual Basic] Modifier et utiliser un composant MSFlexGrid[Résolu] [VBA] Comment lancer un .chm ?
[RESOLU] Recherche éditeur table SQL ultra basique[RESOLU]ouvrir un répertoire sélectionné et lister
[JAVA/JSP] Formulaire JSP/Servlet - Conservations de données [Resolu][résolu] Ajax et erreur de syntaxe
Plus de sujets relatifs à : [Résolu] Ifstream et commentaires


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