OVH Cloud OVH Cloud

Lecture d'un fichier avec alloc dynamique

14 réponses
Avatar
TigrouMeow
Bonsoir ;)

J'aimerais utiliser au mieux les librairies du C++ donc je pense qu'on peut
éviter les réallocations dynamiques pour lire un fichier.

Pour l'instant, pour la lecture d'un fichier ligne par ligne, je fais :
char str[10];

file.getline(str, 10, '\n');
cout << "lu: " << str << endl;
file.getline(str, 10, '\n');
cout << "lu: " << str << endl;

Bon c'est un méchant copier collé très crade, je vous l'accorde mais c'est
seulement pour l'idée. Je pensais qu'en utilisant les templates j'aurais pu
utiliser des strings à la place des char []. Je ne sais pas quelle taille va
faire ma ligne à l'avance ! J'aimerais éviter d'allouer une taille qui sera
soit trop élevée, soit trop faible... et que ça soit dynamique en utilisant
les strings.

Comment faire ? Je vous remercie ! :)

--
TigrouMeow :)
================================
Le site des fournisseurs d'accès :
http://www.fai-fr.com
================================

10 réponses

1 2
Avatar
David
Bonsoir ;)

J'aimerais utiliser au mieux les librairies du C++ donc je pense qu'on peut
éviter les réallocations dynamiques pour lire un fichier.

Pour l'instant, pour la lecture d'un fichier ligne par ligne, je fais :
char str[10];

file.getline(str, 10, 'n');
cout << "lu: " << str << endl;
file.getline(str, 10, 'n');
cout << "lu: " << str << endl;

Bon c'est un méchant copier collé très crade, je vous l'accorde mais c'est
seulement pour l'idée. Je pensais qu'en utilisant les templates j'aurais pu
utiliser des strings à la place des char []. Je ne sais pas quelle taille va
faire ma ligne à l'avance ! J'aimerais éviter d'allouer une taille qui sera
soit trop élevée, soit trop faible... et que ça soit dynamique en utilisant
les strings.

Comment faire ? Je vous remercie ! :)



Bonjour, peut être simplement :

string line;
while( getline( file, line ) )
cout << "lu " << line << endl;

Avatar
Jean-Marc Bourguet
"TigrouMeow" writes:

Comment faire ? Je vous remercie ! :)


Il y a un

std::isteam& std::getline(std::istream&, std::string&);

définit dans <string>

A+

--
Jean-Marc
FAQ de fclc++: http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ
C++ FAQ Lite en VF: http://www.ifrance.com/jlecomte/c++/c++-faq-lite/index. html
Site de usenet-fr: http://www.usenet-fr.news.eu.org

Avatar
TigrouMeow
"David" a écrit dans le message de news:
41683fe6$0$1149$
Bonsoir ;)

J'aimerais utiliser au mieux les librairies du C++ donc je pense qu'on
peut éviter les réallocations dynamiques pour lire un fichier.

Pour l'instant, pour la lecture d'un fichier ligne par ligne, je fais :
char str[10];

file.getline(str, 10, 'n');
cout << "lu: " << str << endl;
file.getline(str, 10, 'n');
cout << "lu: " << str << endl;

Bon c'est un méchant copier collé très crade, je vous l'accorde mais
c'est seulement pour l'idée. Je pensais qu'en utilisant les templates
j'aurais pu utiliser des strings à la place des char []. Je ne sais pas
quelle taille va faire ma ligne à l'avance ! J'aimerais éviter d'allouer
une taille qui sera soit trop élevée, soit trop faible... et que ça soit
dynamique en utilisant les strings.

Comment faire ? Je vous remercie ! :)



Bonjour, peut être simplement :

string line;
while( getline( file, line ) )
cout << "lu " << line << endl;


En effet, merci ! Je pensais que ça marchait en faisant file.getline( ...
mais non !


Avatar
Fabien LE LEZ
On Sat, 9 Oct 2004 21:49:48 +0200, "TigrouMeow"
:

Je pensais que ça marchait en faisant file.getline( ...


En fait, vraisemblablement pour des raisons historiques, le header
<iostream> ne connaît rien de std::string.


--
;-)

Avatar
Alexandre
"Fabien LE LEZ" a écrit dans le message de news:

On Sat, 9 Oct 2004 21:49:48 +0200, "TigrouMeow"
:

Je pensais que ça marchait en faisant file.getline( ...


En fait, vraisemblablement pour des raisons historiques, le header
<iostream> ne connaît rien de std::string.


parce qu'il me semble qu'il est plus ancien, non ? D'où une utilisation
exclusive de nos chers (char *)....
A chaque fois ça me choque d'ailleurs. Je passe beaucoup de temps à dire à
mes étudiants : n'utilisez pas char [], mais string !
et puis dès qu'on ouvre un fichier (avec fstream par ex) il faut fournir le
nom par (char *)... Ok il y c_str() mais c'est pas évident de leur faire
comprendre qu'il faut utiliser string quand une classe standard ne l'utilise
pas ! Il y aurait quand même pu avoir une surcharge...


Avatar
Fabien LE LEZ
On Tue, 12 Oct 2004 08:35:10 +0200, "Alexandre"
:

mes étudiants : n'utilisez pas char [], mais string !
et puis dès qu'on ouvre un fichier (avec fstream par ex) il faut fournir le
nom par (char *)


Euh... il y a une confusion, là !
Si "char*" pose énormément de problèmes, "char const*" en pose
beaucoup moins. Or, si je ne m'abuse, on passe le nom d'un fichier par
"char const*".


--
;-)

Avatar
Alexandre
Euh... il y a une confusion, là !
Si "char*" pose énormément de problèmes, "char const*" en pose
beaucoup moins. Or, si je ne m'abuse, on passe le nom d'un fichier par
"char const*".


je sais, je pointais simplement le fait que l'on essaye d'encourager ceux
qui viennent du C à utiliser string à la place d'un char * (même const) et
les classes de la lib standard de le font même pas



--
;-)


Avatar
drkm
"Alexandre" writes:

"Fabien LE LEZ" a écrit dans le message de news:


On Sat, 9 Oct 2004 21:49:48 +0200, "TigrouMeow"
:

Je pensais que ça marchait en faisant file.getline( ...


En fait, vraisemblablement pour des raisons historiques, le header
<iostream> ne connaît rien de std::string.


parce qu'il me semble qu'il est plus ancien, non ?


Ben non, ils sont nés ensemble, le 1er septembre 1998. Après une
période de gestation plus ou moins longue selon le cas. Je ne vois a
priori pas de raison de ne pas avoir surchargé

std::basic_fstream<>::basic_fstream(
char const * filename ,
std::ios_base::openmode mode
) ;

avec :

std::basic_fstream<>::basic_fstream(
std::string filename ,
std::ios_base::openmode mode
) ;

Mais je ne connais pas l'histoire de la norme, et il doit y avoir
une raison qui m'échappe. AMHA, ce n'est cependant pas seulement le
fait que les std::string soient apparues plus tard qui ont empéché
d'ajouter ce constructeur avant la sortie de la norme.

--drkm



Avatar
Loïc Joly
drkm wrote:

"Alexandre" writes:


"Fabien LE LEZ" a écrit dans le message de news:
En fait, vraisemblablement pour des raisons historiques, le header
<iostream> ne connaît rien de std::string.




parce qu'il me semble qu'il est plus ancien, non ?



Ben non, ils sont nés ensemble, le 1er septembre 1998. Après une
période de gestation plus ou moins longue selon le cas. Je ne vois a
priori pas de raison de ne pas avoir surchargé


Ce qui m'a été répondu sur le sujet (je n'étais pas né à l'époque),
c'est qu'un des but était d'essayer d'éviter de créer une dépendance
entre deux en-têtes de la bibliothèque standard, ce qui me semble
personellement une raison assez faible.

--
Loïc



Avatar
Fabien LE LEZ
On Tue, 12 Oct 2004 21:01:16 +0200, Loïc Joly
:

c'est qu'un des but était d'essayer d'éviter de créer une dépendance
entre deux en-têtes de la bibliothèque standard, ce qui me semble
personellement une raison assez faible.


D'autant que la dépendance existe bel et bien (dans un seul sens), il
me semble : getline() est défini dans <string>...


--
;-)

1 2