[c++] parcourir un fichier...

parcourir un fichier... [c++] - Programmation

Marsh Posté le 20-12-2001 à 13:24:38    

bonjour les gens,  
 
 
pour parcourir un fichier, j'ai fait :
 

Code :
  1. char *str;
  2. ifstream infile("nom_fichier", ios::in);
  3. while(!infile.eof())
  4. {
  5.    infile.getline(str, 80, '\n');
  6.    cout << str;
  7. }

 
 
Ca marche pô :(  
 
(sans le while, ca marche)
 
 
En fait, j'ai un fichier avec des données (de différents types) séparés par des ";" (j'ai vu un topic dessus, mais j'ai pas tout compris :sweat: ).
Est-ce que la méthode getline est appropriée pour récupérer ces données, ou peut-on faire "mieux" autrement ?
 
 
 
Voili, si vous pouviez m'éclairer sur tout ca... :jap:

 

[edtdd]--Message édité par art_dupond--[/edtdd]


---------------
oui oui
Reply

Marsh Posté le 20-12-2001 à 13:24:38   

Reply

Marsh Posté le 20-12-2001 à 16:10:03    

Avant que les spécialistes trouvent une solution, le char *str;  
c'est bien, mais un pointeur ne suffit pas à stocker une chaîne. Faut peut-être réserver de la mémoire, ou faire un char str[81];  
 
Pour le reste, désolé, je ne suis qu'au début de mon livre sur le C++...

Reply

Marsh Posté le 20-12-2001 à 19:38:51    

c 'est incroyable la mise en page de la page "répondre" !!!! Jamais vu ça ... Joce !!! Y a un bug !! Faut le voir pour le croire ...
edit : ça le fait même pour édit ou tout ce qui fait taper un texte ...

 

[edtdd]--Message édité par freewol--[/edtdd]

Reply

Marsh Posté le 20-12-2001 à 20:19:03    

Aïe! :eek:


---------------
"Colère et intolérance sont les ennemis d'une bonne compréhension." Gandhi
Reply

Marsh Posté le 23-12-2001 à 08:54:28    

tiens chelou c'est revenu à la normale ... y se passe vraiment des trucs bizzares ici ...

Reply

Marsh Posté le 23-12-2001 à 18:05:55    

Utilise la fonction stat ou fstat pour pouvoir récupérer la taille du fichier, puis alloue ton pointeur qui te sert de buffer avec la fonction malloc. Tu pourras ainsi copier la totalité de ton fichier dans le tampon.


---------------
"PAR LE POUVOIR DU CRÂNE ANCESTRAL, JE DETIENS LA FORCE TOUTE PUISSANTE".
Reply

Marsh Posté le 23-12-2001 à 19:18:19    

CARBON_14 a écrit a écrit :

Avant que les spécialistes trouvent une solution, le char *str;  
c'est bien, mais un pointeur ne suffit pas à stocker une chaîne. Faut peut-être réserver de la mémoire, ou faire un char str[81];  
 
Pour le reste, désolé, je ne suis qu'au début de mon livre sur le C++...  




t'es sur de ca :heink:
Le C++ alloue pas la mémoire dynamiquement dans ce cas non :??:


---------------
Protèges carnets personnalisés & accessoires pour bébé
Reply

Marsh Posté le 26-12-2001 à 17:12:09    

joce a écrit a écrit :

 
t'es sur de ca :heink:
Le C++ alloue pas la mémoire dynamiquement dans ce cas non :??:  




 
Argh !
ben non char *, on ne te l'alloue
pas dans ton dos, surtout que ton char * la
il est passe en valeur et pas par reference
(donc getline il aurait du mal a modifier sa valeur pour
y placer un pointeur alloue).
 
La solution c'est soit de definir un char toto[81];
pour pouvoir y caser 80 caracteres (plus le nul terminal)
soit d'utiliser les std::string
(mais c'est plus lourd que le char *).
 
Par ailleurs le comportement de ton appli
n'est pas bien defini :
le getline ne stocke pas le caractere terminal
dans ta chaine, ce qui fait que la sortie
risque d'etre desordonnee (les passages a la ligne
seront bouffes).
 
Si tu veux reprogrammer cat
il vaut peut-etre mieux travailler en mode
binaire et utiliser les fonctions
istream::read et ostream::write..
 
Sinon allouer un tampon de la taille de ton fichier
c'est plutot une mauvaise idee => si ton fichier
fait 1 Go je n'ose pas imaginer..  
pour optimiser les appels systemes, il vaut mieux
travailler avec des tampons de taille
assez importante, la taille optimale
depend evidemment des circonstances,
mais des tampons trop gros provoquent
des rallentissements lies a la gestion
de la memoire et des tampons trop petits
sont inefficaces parce que tu multiplies des appels
systeme pour pas grand chose.
 
A+
LEGREG

 

[edtdd]--Message édité par legreg--[/edtdd]

Reply

Sujets relatifs:

Leave a Replay

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