ifstream, >>

ifstream, >> - C++ - Programmation

Marsh Posté le 27-11-2006 à 18:40:06    

Bonjour,
Comment feriez vous pour lire un fichier texte dont vous ne connaissez pas le nombre de colonnes?
L'idée que j'ai actuellement, c'est de mettre la ligne complète dans une string, de chercher les espaces, et de relire les variables dans chaque substr(). Mais en particulier, il peut arriver par exemple que le fichier ne soit pas spécialement bien formaté, et qu'on ait des trucs du style :
123.456 azerty 654
123.45 fghjkkkayfgayga 456789
Ce qui veut dire que les substr() de la première ligne ne fonctionnent pas avec la 2eme ligne, et qu'il faut donc répéter l'opération sur toutes les lignes. Donc c'est très lourd. Zavez une petite idée de la solution?
Question subsidiaire :
fichier >> a >>b >>c; fonctionne.
Si on ne connait pas le nombre d'entrée, comment faire? (c'est pour ça que j'ai pensé à la première question).
Merci
 
 

Reply

Marsh Posté le 27-11-2006 à 18:40:06   

Reply

Marsh Posté le 27-11-2006 à 19:40:41    

Disons qu'il faudrait quand même avoir une référence; si chaque ligne peut etre différentes des autres, une idée serait de faire une stl::map , avec en clé une string concaténée par le numéro de la ligne et le numéro de la colonne genre "ITEM_R1_C1". Ainsi quand tu fais une recherche ligne/colonne, tu vérifies que la cle existe.  
 
De plus tu devrais stocker les float ou entier sous forme de string, et les convertir par la suite


---------------
Töp of the plöp
Reply

Marsh Posté le 27-11-2006 à 19:57:04    

Disons pour préciser que je ne sais pas a priori le nombre de colonnes, mais que ce nombre est constant, sauf que le fichier est mal formaté.
Ce que je cherche, en gros, c'est un truc du style READ(10,*) (x(i),i=1,10) comme en fortran.

Reply

Marsh Posté le 27-11-2006 à 19:58:50    

Avant de penser que c'est lourd de calculer les colonnes à chaque fois, fait le et vérifie si c'est trop lent pour ton application, si ça l'est pas y'a pas de raison de changer.

Reply

Marsh Posté le 27-11-2006 à 20:00:52    

Oui, c'est vrai, il y a quelques GHz sous le capot, maintenant.

Reply

Marsh Posté le 27-11-2006 à 20:04:10    

C'est à dire que bon, lire entièrement le fichier pour tenter d'en déduire le nombre de colonnes (à moins qu'on ait une ligne de référence sûre), ce n'est pas très efficace, quand même...
 


---------------
Töp of the plöp
Reply

Marsh Posté le 27-11-2006 à 20:07:29    

Non, non, la première ligne est la bonne en terme de nombre de colonnes ! C'est juste que les colonnes peuvent ne pas contenir le même nombre de caractères d'une ligne à l'autre.


Message édité par GrosBocdel le 27-11-2006 à 20:09:03
Reply

Marsh Posté le 27-11-2006 à 20:51:23    

Heuuu, bon, j'ai du me taper un délire.
 
J'étais persuadé qu'en faisant
fichier>>a;
fichier>>b;
il irait chercher b sur la 2eme ligne...
C'est OK, alors. Je récupère le nombre de champs sur la 1ere ligne et ce sera OK pour les autres...A peu de chose près sachant que les séparateurs ne sont pas forcément des espaces.


Message édité par GrosBocdel le 27-11-2006 à 20:55:45
Reply

Marsh Posté le 28-11-2006 à 08:23:56    

std::getline

Reply

Marsh Posté le 16-11-2007 à 08:17:54    

salu,
je ne sais pas si g bien compri mais si les lignes sont séparées par des <enter> dans ton fichier, jme demande si ca marcherais pas si tu faisais un truc du genre:
 
string Ligne_a_lire
ifstream tonfichier;
tonfichier.open("blabla" );
 
while(!tonfichier.eof())
{
    getline(tonfichier, Ligne_a_lire);
    '\n'  // pour ton saut de ligne :p
}
 
//etc...................
 
 
parce que quand tu fais des >> ton prog va faire une lecture mot par mot de ton fichier, donc bon ca va pas lire lé lignes :p
par contre si tu fais le while (!fichier.eof()), ta meme pas besoin de savoir le nombre de colonnes parce que tu dis au programe que tant que le fichier texte n'est pas arrivé a sa fin, il te lit ligne par ligne.
 
maintenant si tu veux faire dé cout<< tu nas qua ajouter:
 
while(!tonfichier.eof())
{
    getline(tonfichier, Ligne_a_lire);
    cout<<Ligne_a_lire;
    '\n'  // pour ton saut de ligne :p
 
}
 
enfin bon je suis encore tré tré débutante en c++, p-e que g rien compri o topic lol xD

Reply

Marsh Posté le 16-11-2007 à 08:17:54   

Reply

Marsh Posté le 16-11-2007 à 08:19:25    

oups...oublié de lé ";" a la fin des instructions lol :D

Reply

Marsh Posté le 16-11-2007 à 10:39:00    

archi faux. Il ne faut pas utiliser eof.

Reply

Marsh Posté le 16-11-2007 à 17:51:47    

pourquoi ça ?

Reply

Marsh Posté le 16-11-2007 à 18:28:23    

weblook$$ a écrit :

pourquoi ça ?

Parce que eof ne fait pas ce que tu crois qu'il fait.
Fonctionnement contre-intuitif => à éviter pour les débutants.


---------------
TriScale innov
Reply

Marsh Posté le 17-11-2007 à 04:50:16    


ben alors pk ca marche tj quand jutilise while(!fichier.eof()) dans mé codes?

Reply

Marsh Posté le 17-11-2007 à 09:18:44    

ca s'appelle de la chance :o
le propre d'un comportement indéfini c'est d'avoir l'air de fonctionner

Reply

Sujets relatifs:

Leave a Replay

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