OVH Cloud OVH Cloud

array inconnu

6 réponses
Avatar
giovanni
comment charger dans un array un fichier de taille inconnu ligne de 5
chiffre dans le fichier mais ne sachant combien de ligne il y a
comment tout charger en memoire et reprendre ensuite pour trier etc

6 réponses

Avatar
Marc Boyer
Le 15-02-2006, giovanni a écrit :
comment charger dans un array un fichier de taille inconnu ligne de 5
chiffre dans le fichier mais ne sachant combien de ligne il y a
comment tout charger en memoire et reprendre ensuite pour trier etc


1) reformuler en français (langage de ce forum) en mettant
les verbes, les points, et autres subtilités
2) regarder std::vector, std::ifstream, std::ofstream
3) regarder std::sort

Marc Boyer
--
Entre le fort et le faible, c'est la liberte qui opprime et le droit
qui libere. Henri Lacordaire, Dominicain

Avatar
giovanni
ok je reformule
charger un fichier du type text : 1 2 3 4 5
6 7 1 2 3
etc
en memoire taille du fichier inconnu !

ensuite quand en memoire faire un tri ex: 1 2 3 4 5
1 2 3 6 7
etc
et resauver le fichier trier
voila


"Marc Boyer" a écrit dans le message
de news:
comment charger dans un array un fichier de taille inconnu ligne de 5
chiffre dans le fichier mais ne sachant combien de ligne il y a
comment tout charger en memoire et reprendre ensuite pour trier etc


1) reformuler en français (langage de ce forum) en mettant
les verbes, les points, et autres subtilités
2) regarder std::vector, std::ifstream, std::ofstream
3) regarder std::sort

Marc Boyer
--
Entre le fort et le faible, c'est la liberte qui opprime et le droit
qui libere. Henri Lacordaire, Dominicain



Avatar
Marc Boyer
Le 15-02-2006, giovanni a écrit :
ok je reformule
charger un fichier du type text : 1 2 3 4 5
6 7 1 2 3
etc
en memoire taille du fichier inconnu !

ensuite quand en memoire faire un tri ex: 1 2 3 4 5
1 2 3 6 7
etc
et resauver le fichier trier


Et bien il suffit de faire une std::vector de ligne.
On peut discuter un peu la modélisation de chaque ligne,
une classe Ligne, un tableau de 5 int ou un vector d'int.

Ensuite, on écrit deux fonctions read/print membres de ligne
qui prennent en paramètre respectivement un istream&/ostream&
qui remplissent une ligne, soit en lisant 5 entiers, soit
jusqu'à la fin de ligne.

On ecrit aussi une fonction membre trier, qui utilise
std::sort.

Une fois que la classe Ligne est faite, pour lire le fichier,
on ouvre un ifstream, on crée un std::vector<Ligne>, et on
fait une petite boucle qui lit chaque ligne, crée une Ligne
associée, l'ajoute à la fin du vector (methode push_back)
et la trie.
Reste à ensuite à écrire dans un fichier: on ouvre un
ofstream, on parcourt le tableau, on écrit chaque ligne
avec print, et voilà.

fclc++ étant un forum d'entraide et pas un forum qui fait
des programmes à votre place, c'est maintenant à toi de travailler.
Quand tu auras écrit un peu de code, si tu as du mal, reviens
le poster.


Marc Boyer
--
Entre le fort et le faible, c'est la liberte qui opprime et le droit
qui libere. Henri Lacordaire, Dominicain

Avatar
kanze
Marc Boyer wrote:
ok je reformule
charger un fichier du type text : 1 2 3 4 5
6 7 1 2 3
etc
en memoire taille du fichier inconnu !

ensuite quand en memoire faire un tri ex: 1 2 3 4 5
1 2 3 6 7
etc
et resauver le fichier trier


Et bien il suffit de faire une std::vector de ligne. On peut
discuter un peu la modélisation de chaque ligne, une classe
Ligne, un tableau de 5 int ou un vector d'int.


La question, je crois, c'es s'il veut canoniser le format de la
ligne ou non. A priori, je verrais bien une classe qui encapsule
les cinq entiers, avec des opérateurs <, << et >> qui conviennent,
et ensuite:

std::vector< Int5 > v( (std::istream_iterator< Int5 >( file)),
(std::istream_iterator< Int5 >() ) ) ;
std::sort( v.begin(), v.end() ) ;
std::copy( v.begin(), v.end(), std::ostream_iterator< Int5 >( dest
) ) ;

(Sauf qu'évidemment, il faudrait des vérifications des erreurs,
surtout après le constructeur de v.)

À titre d'exemple, l'opérateur >> pourrait bien être quelque
chose du genre :

std::string line ;
if ( std::getline( src, line ) ) {
std::istringstream s( line ) ;
int i1, i2, i3, i4, i5 ;
s >> i1 >> i2 >> i3 >> i4 >> i5 >> std::ws ;
if ( ! s || s.peek() != EOF ) {
src.setstate( std::ios::failbit ) ;
} else {
// Affecter les cinq entiers à leur dest. finale.
}
}
return src ;

S'il faut conserver le format original de chaque ligne, je
ferais à peu près pareil, mais je stockerais également la ligne
lu ci-dessus dans l'objet.

--
James Kanze GABI Software
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34


Avatar
giovanni
justement je sais pas comment l'ecrire lire un fichier oui

fichier.open("test.txt", ios::in);
while (!fichier.eof()) {
fichier >> nb_0 >> nb_1 >> nb_2 >> nb_3>> nb_4 >> nb_5 ;
fichier2.open("test.txt", ios::in);
if(!fichier2){
cerr << "erreur: ne s'ouvre pas n";
exit(1);}
while(!fichier2.eof())

mais le probleme c'est je sais pas faire coment charger en vector ligne par
ligne et ensuite reprendre une ligne analyser et trier ex 1 5 7 8 2
trier -> 1 2 5 7 8 et faire ca a toute les ligneet ensuite resauver ur un
fichier suivant voila
"kanze" a écrit dans le message de news:

Marc Boyer wrote:
ok je reformule
charger un fichier du type text : 1 2 3 4 5
6 7 1 2 3
etc
en memoire taille du fichier inconnu !

ensuite quand en memoire faire un tri ex: 1 2 3 4 5
1 2 3 6 7
etc
et resauver le fichier trier


Et bien il suffit de faire une std::vector de ligne. On peut
discuter un peu la modélisation de chaque ligne, une classe
Ligne, un tableau de 5 int ou un vector d'int.


La question, je crois, c'es s'il veut canoniser le format de la
ligne ou non. A priori, je verrais bien une classe qui encapsule
les cinq entiers, avec des opérateurs <, << et >> qui conviennent,
et ensuite:

std::vector< Int5 > v( (std::istream_iterator< Int5 >( file)),
(std::istream_iterator< Int5 >() ) ) ;
std::sort( v.begin(), v.end() ) ;
std::copy( v.begin(), v.end(), std::ostream_iterator< Int5 >( dest
) ) ;

(Sauf qu'évidemment, il faudrait des vérifications des erreurs,
surtout après le constructeur de v.)

À titre d'exemple, l'opérateur >> pourrait bien être quelque
chose du genre :

std::string line ;
if ( std::getline( src, line ) ) {
std::istringstream s( line ) ;
int i1, i2, i3, i4, i5 ;
s >> i1 >> i2 >> i3 >> i4 >> i5 >> std::ws ;
if ( ! s || s.peek() != EOF ) {
src.setstate( std::ios::failbit ) ;
} else {
// Affecter les cinq entiers à leur dest. finale.
}
}
return src ;

S'il faut conserver le format original de chaque ligne, je
ferais à peu près pareil, mais je stockerais également la ligne
lu ci-dessus dans l'objet.

--
James Kanze GABI Software
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34


Avatar
Marc Boyer
Le 17-02-2006, giovanni a écrit :

Bonjour,

c'est peut-être du à une méconnaissance des usages Usenet,
mais il y a deux trois règles si on veut obtenir de l'aide
dans un forum, dont la manière de répondre (on répond en
dessous du texte de la personne à laquelle on répond,
écrire en Français avec des phrases, des verbes et
des points, etc).

http://usenet-fr.news.eu.org/fr-chartes/

justement je sais pas comment l'ecrire lire un fichier oui

fichier.open("test.txt", ios::in);
while (!fichier.eof()) {
fichier >> nb_0 >> nb_1 >> nb_2 >> nb_3>> nb_4 >> nb_5 ;
fichier2.open("test.txt", ios::in);
if(!fichier2){
cerr << "erreur: ne s'ouvre pas n";
exit(1);}
while(!fichier2.eof())


Avez-vous un livre de C++ sous la main ?

Marc Boyer
--
Entre le fort et le faible, c'est la liberte qui opprime et le droit
qui libere. Henri Lacordaire, Dominicain