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

  FORUM HardWare.fr
  Programmation
  C++

  ifstream, >>

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

ifstream, >>

n°1482528
GrosBocdel
Posté le 27-11-2006 à 18:40:06  profilanswer
 

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
 
 

mood
Publicité
Posté le 27-11-2006 à 18:40:06  profilanswer
 

n°1482551
_darkalt3_
Proctopathe
Posté le 27-11-2006 à 19:40:41  profilanswer
 

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
n°1482561
GrosBocdel
Posté le 27-11-2006 à 19:57:04  profilanswer
 

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.

n°1482563
0x90
Posté le 27-11-2006 à 19:58:50  profilanswer
 

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.

n°1482568
GrosBocdel
Posté le 27-11-2006 à 20:00:52  profilanswer
 

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

n°1482570
_darkalt3_
Proctopathe
Posté le 27-11-2006 à 20:04:10  profilanswer
 

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
n°1482575
GrosBocdel
Posté le 27-11-2006 à 20:07:29  profilanswer
 

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
n°1482597
GrosBocdel
Posté le 27-11-2006 à 20:51:23  profilanswer
 

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
n°1482769
Taz
bisounours-codeur
Posté le 28-11-2006 à 08:23:56  profilanswer
 

std::getline

n°1643699
c_sarah
=]
Posté le 16-11-2007 à 08:17:54  profilanswer
 

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

mood
Publicité
Posté le 16-11-2007 à 08:17:54  profilanswer
 

n°1643700
c_sarah
=]
Posté le 16-11-2007 à 08:19:25  profilanswer
 

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

n°1643793
Taz
bisounours-codeur
Posté le 16-11-2007 à 10:39:00  profilanswer
 

archi faux. Il ne faut pas utiliser eof.

n°1644175
weblook$$
Posté le 16-11-2007 à 17:51:47  profilanswer
 

pourquoi ça ?

n°1644188
franceso
Posté le 16-11-2007 à 18:28:23  profilanswer
 

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
n°1644320
c_sarah
=]
Posté le 17-11-2007 à 04:50:16  profilanswer
 


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

n°1644334
Joel F
Real men use unique_ptr
Posté le 17-11-2007 à 09:18:44  profilanswer
 

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


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

  ifstream, >>

 

Sujets relatifs
[visual 2003] [ifstream] problème de tellg en ios::binaryifstream non déclaré
help ! seekg et ifstream , ça marche pas ![c++] ifstream et taille de fichier
[pb ifstream] get zap des caracters[c++] problème avec ifstream et fonction getline
STL: ifstream[C++] délimiteur sous ifstream
Plus de sujets relatifs à : ifstream, >>


Copyright © 1997-2025 Groupe LDLC (Signaler un contenu illicite / Données personnelles)