[Résolu] Ifstream et commentaires

Ifstream et commentaires [Résolu] - C++ - Programmation

Marsh Posté le 22-01-2007 à 18:21:07    

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
Reply

Marsh Posté le 22-01-2007 à 18:21:07   

Reply

Marsh Posté le 22-01-2007 à 18:40:51    

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
Reply

Marsh Posté le 23-01-2007 à 10:27:02    

oh des moches char* ...
un moche eof

Reply

Marsh Posté le 23-01-2007 à 14:57:06    

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
Reply

Marsh Posté le 23-01-2007 à 16:00:11    

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

Reply

Marsh Posté le 23-01-2007 à 20:36:54    

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
Reply

Marsh Posté le 24-01-2007 à 09:15:27    

non c'est faux.

Reply

Marsh Posté le 24-01-2007 à 11:55:26    

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
Reply

Marsh Posté le 24-01-2007 à 13:36:26    

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.

Reply

Marsh Posté le 24-01-2007 à 14:17:45    

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

Reply

Marsh Posté le 24-01-2007 à 14:17:45   

Reply

Marsh Posté le 24-01-2007 à 15:15:54    

laisse tomber

Reply

Sujets relatifs:

Leave a Replay

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