 |
C++Talk.NET C++ language newsgroups
|
| View previous topic :: View next topic |
| Author |
Message |
giovanni Guest
|
Posted: Tue Jan 25, 2005 5:53 am Post subject: erreur avec while eof ? |
|
|
voila le while(!fichier.eof()) se fais mais mal me fais que pause me affiche
et le
while(!fichier2.eof()) lui affiche les printf...
je sais pas pourquoi
donc ce programme compare une ligne (fichier) avec toute les autre ligne du
(fichier2) ensuite passe a la ligne suivante et refais la meme chose merci
#include <cstdlib>
#include <iostream>
#include <fstream>
#include <stdlib.h>
using namespace std;
int main()
{
ifstream fichier;
int nb_0, nb_1, nb_2, nb_3, nb_4, nb_5, nb_6, nb_7;
int ok_1, ok_2, ok_3, ok_4, ok_5, ok_6, ok_7, ok_8, ok_9;
ifstream fichier2;
int nb_00, nb_11,nb_22, nb_33,nb_44, nb_55, nb_66, nb_77;
ok_1=0;
fichier.open("text.txt", ios::in);
fichier2.open("text2.txt", ios::in);
if(fichier.bad())
return(1); // errore
if(fichier2.bad())
return(1); // errore
while(!fichier.eof()){
fichier >> nb_0 >> nb_1 >> nb_2 >> nb_3>> nb_4 >> nb_5 >> nb_6>>
nb_7 ;
while(!fichier2.eof()){
fichier2 >> nb_00 >> nb_11 >> nb_22 >> nb_33 >> nb_44 >> nb_55 >> nb_66 >>
nb_77;
printf(" lign a %d", nb_11);
printf(" %d", nb_22);
printf(" %d", nb_33);
printf(" %d", nb_44);
printf(" %d", nb_55);
printf(" %d", nb_66);
printf(" %dn", nb_77);
printf(" ligne b %d", nb_1);
printf(" %d", nb_2);
printf(" %d", nb_3);
printf(" %d", nb_4);
printf(" %d", nb_5);
printf(" %d", nb_6);
printf(" %dn", nb_7);
if (nb_11==nb_1) ok_1=ok_1+1;
if (nb_11==nb_2) ok_1=ok_1+1;
if (nb_11==nb_3) ok_1=ok_1+1;
if (nb_11==nb_4) ok_1=ok_1+1;
if (nb_11==nb_5) ok_1=ok_1+1;
if (nb_22==nb_2) ok_1=ok_1+1;
if (nb_22==nb_3) ok_1=ok_1+1;
if (nb_22==nb_4) ok_1=ok_1+1;
if (nb_22==nb_5) ok_1=ok_1+1;
if (nb_33==nb_3) ok_1=ok_1+1;
if (nb_33==nb_4) ok_1=ok_1+1;
if (nb_44==nb_5) ok_1=ok_1+1;
if (nb_44==nb_4) ok_1=ok_1+1;
if (nb_44==nb_5) ok_1=ok_1+1;
if (nb_55==nb_5) ok_1=ok_1+1;
printf(" ok=%dn",ok_1);
ok_1=0;
}
system("pause");
}
system("pause");
fichier2.close();
// chiudere file
fichier.close();
return(0);
}
|
|
| Back to top |
|
 |
kanze@gabi-soft.fr Guest
|
Posted: Tue Jan 25, 2005 9:51 am Post subject: Re: erreur avec while eof ? |
|
|
giovanni wrote:
| Quote: | voila le while(!fichier.eof()) se fais mais mal me fais que
pause me affiche et le
while(!fichier2.eof()) lui affiche les printf...
je sais pas pourquoi
|
Pas besoin d'aller plus loin -- while avec la fonction eof() est
toujours une erreur.
Est-ce que tu as vérifié ce que fait la fonction eof() dans la
doc ? Parce que les noms des fonctions dans la norme sont
souvent trompeur (remove n'enlève rien, par exemple). En
l'occurance, la fonction ios::eof() n'indique rien en ce qui
concerne ce qui s'est passé à l'interface -- elle signifie qu'on
a vu une fin de fichier internalement, peut-être suite à une
lecture anticipée. L'idiome classique pour lire un fichier,
c'est :
while ( fichier >> dest ) ...
ou
while ( std::getline( fichier, ligne ) ) ...
| Quote: | donc ce programme compare une ligne (fichier) avec toute les
autre ligne du (fichier2) ensuite passe a la ligne suivante et
refais la meme chose merci
#include <cstdlib
#include
#include
#include
using namespace std;
int main()
{
ifstream fichier;
int nb_0, nb_1, nb_2, nb_3, nb_4, nb_5, nb_6, nb_7;
int ok_1, ok_2, ok_3, ok_4, ok_5, ok_6, ok_7, ok_8, ok_9;
ifstream fichier2;
int nb_00, nb_11,nb_22, nb_33,nb_44, nb_55, nb_66, nb_77;
ok_1=0;
fichier.open("text.txt", ios::in);
fichier2.open("text2.txt", ios::in);
if(fichier.bad())
|
if ( ! fichier ) ...
ou
if ( ! fichier.is_open() ) ...
Un échec lors de l'ouverture positionne fail, et non bad. (En
général, bad se réserve pour des erreurs « dure », une erreur
hardware lors d'une écriture, par exemple.)
| Quote: | return(1); // errore
if(fichier2.bad())
|
Comme ci-dessus.
| Quote: | return(1); // errore
while(!fichier.eof()){
|
while ( fichier >> ... ) {
| Quote: | fichier >> nb_0 >> nb_1 >> nb_2 >> nb_3>> nb_4 >> nb_5 >> nb_6
nb_7 ;
while(!fichier2.eof()){
|
while ( fichier2 >> ... ) {
Note qu'après la première fois dans la boucle exterieur, cette
condition sera toujours fausse. Si tu veux rélire le fichier2
pour chaque groupe d'entrées du fichier un, il faudrait quelque
chose comme :
fichier2.clear() ;
fichier2.gseek( std::ios::beg, 0 ) ;
après cette boucle. Mais ça risque d'être extrèmement lent,
rélire le fichier chaque fois. Si possible, je lirai tout le
fichier une seule fois, en mémoire, et je travaillerais en
mémoire.
--
James Kanze GABI Software http://www.gabi-soft.fr
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
|
|
| Back to top |
|
 |
giovanni Guest
|
Posted: Tue Jan 25, 2005 1:24 pm Post subject: Re: erreur avec while eof ? |
|
|
ok mais escuse mais je tres debutant enfin en c++ j'arrive as encore manier
string pour ca fais fichier et pas en memoire enfin pour l 'nstant pas
trouver comment faire avec( while( fichier>>))
peu tu etre un peu plus d'info
<kanze (AT) gabi-soft (DOT) fr> a écrit dans le message de news:
[email]1106646706.217845.299620 (AT) c13g2000cwb (DOT) googlegroups.com[/email]...
giovanni wrote:
| Quote: | voila le while(!fichier.eof()) se fais mais mal me fais que
pause me affiche et le
while(!fichier2.eof()) lui affiche les printf...
je sais pas pourquoi
|
Pas besoin d'aller plus loin -- while avec la fonction eof() est
toujours une erreur.
Est-ce que tu as vérifié ce que fait la fonction eof() dans la
doc ? Parce que les noms des fonctions dans la norme sont
souvent trompeur (remove n'enlève rien, par exemple). En
l'occurance, la fonction ios::eof() n'indique rien en ce qui
concerne ce qui s'est passé à l'interface -- elle signifie qu'on
a vu une fin de fichier internalement, peut-être suite à une
lecture anticipée. L'idiome classique pour lire un fichier,
c'est :
while ( fichier >> dest ) ...
ou
while ( std::getline( fichier, ligne ) ) ...
| Quote: | donc ce programme compare une ligne (fichier) avec toute les
autre ligne du (fichier2) ensuite passe a la ligne suivante et
refais la meme chose merci
#include <cstdlib
#include
#include
#include
using namespace std;
int main()
{
ifstream fichier;
int nb_0, nb_1, nb_2, nb_3, nb_4, nb_5, nb_6, nb_7;
int ok_1, ok_2, ok_3, ok_4, ok_5, ok_6, ok_7, ok_8, ok_9;
ifstream fichier2;
int nb_00, nb_11,nb_22, nb_33,nb_44, nb_55, nb_66, nb_77;
ok_1=0;
fichier.open("text.txt", ios::in);
fichier2.open("text2.txt", ios::in);
if(fichier.bad())
|
if ( ! fichier ) ...
ou
if ( ! fichier.is_open() ) ...
Un échec lors de l'ouverture positionne fail, et non bad. (En
général, bad se réserve pour des erreurs « dure », une erreur
hardware lors d'une écriture, par exemple.)
| Quote: | return(1); // errore
if(fichier2.bad())
|
Comme ci-dessus.
| Quote: | return(1); // errore
while(!fichier.eof()){
|
while ( fichier >> ... ) {
| Quote: | fichier >> nb_0 >> nb_1 >> nb_2 >> nb_3>> nb_4 >> nb_5 >> nb_6
nb_7 ;
while(!fichier2.eof()){
|
while ( fichier2 >> ... ) {
Note qu'après la première fois dans la boucle exterieur, cette
condition sera toujours fausse. Si tu veux rélire le fichier2
pour chaque groupe d'entrées du fichier un, il faudrait quelque
chose comme :
fichier2.clear() ;
fichier2.gseek( std::ios::beg, 0 ) ;
après cette boucle. Mais ça risque d'être extrèmement lent,
rélire le fichier chaque fois. Si possible, je lirai tout le
fichier une seule fois, en mémoire, et je travaillerais en
mémoire.
--
James Kanze GABI Software http://www.gabi-soft.fr
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
|
|
| Back to top |
|
 |
giovanni Guest
|
Posted: Tue Jan 25, 2005 3:40 pm Post subject: Re: erreur avec while eof ? |
|
|
j'ai essayer de mettre ca en memoire le prob maintenant avec tableau comment
savoir la taille max? que je peu cree et utiliser la memoire dynamique
comment faire
comme je sais pas la taille du fichier petit fichier ou gros fichier
"giovanni" <giovannisch (AT) hotmail (DOT) com> a écrit dans le message de news:
41f6488e$1 (AT) ews20 (DOT) ..
| Quote: | ok mais escuse mais je tres debutant enfin en c++ j'arrive as encore
manier string pour ca fais fichier et pas en memoire enfin pour l 'nstant
pas trouver comment faire avec( while( fichier>>))
peu tu etre un peu plus d'info
[email]kanze (AT) gabi-soft (DOT) fr[/email]> a écrit dans le message de news:
[email]1106646706.217845.299620 (AT) c13g2000cwb (DOT) googlegroups.com[/email]...
giovanni wrote:
voila le while(!fichier.eof()) se fais mais mal me fais que
pause me affiche et le
while(!fichier2.eof()) lui affiche les printf...
je sais pas pourquoi
Pas besoin d'aller plus loin -- while avec la fonction eof() est
toujours une erreur.
Est-ce que tu as vérifié ce que fait la fonction eof() dans la
doc ? Parce que les noms des fonctions dans la norme sont
souvent trompeur (remove n'enlève rien, par exemple). En
l'occurance, la fonction ios::eof() n'indique rien en ce qui
concerne ce qui s'est passé à l'interface -- elle signifie qu'on
a vu une fin de fichier internalement, peut-être suite à une
lecture anticipée. L'idiome classique pour lire un fichier,
c'est :
while ( fichier >> dest ) ...
ou
while ( std::getline( fichier, ligne ) ) ...
donc ce programme compare une ligne (fichier) avec toute les
autre ligne du (fichier2) ensuite passe a la ligne suivante et
refais la meme chose merci
#include <cstdlib
#include
#include
#include
using namespace std;
int main()
{
ifstream fichier;
int nb_0, nb_1, nb_2, nb_3, nb_4, nb_5, nb_6, nb_7;
int ok_1, ok_2, ok_3, ok_4, ok_5, ok_6, ok_7, ok_8, ok_9;
ifstream fichier2;
int nb_00, nb_11,nb_22, nb_33,nb_44, nb_55, nb_66, nb_77;
ok_1=0;
fichier.open("text.txt", ios::in);
fichier2.open("text2.txt", ios::in);
if(fichier.bad())
if ( ! fichier ) ...
ou
if ( ! fichier.is_open() ) ...
Un échec lors de l'ouverture positionne fail, et non bad. (En
général, bad se réserve pour des erreurs « dure », une erreur
hardware lors d'une écriture, par exemple.)
return(1); // errore
if(fichier2.bad())
Comme ci-dessus.
return(1); // errore
while(!fichier.eof()){
while ( fichier >> ... ) {
fichier >> nb_0 >> nb_1 >> nb_2 >> nb_3>> nb_4 >> nb_5 >> nb_6
nb_7 ;
while(!fichier2.eof()){
while ( fichier2 >> ... ) {
Note qu'après la première fois dans la boucle exterieur, cette
condition sera toujours fausse. Si tu veux rélire le fichier2
pour chaque groupe d'entrées du fichier un, il faudrait quelque
chose comme :
fichier2.clear() ;
fichier2.gseek( std::ios::beg, 0 ) ;
après cette boucle. Mais ça risque d'être extrèmement lent,
rélire le fichier chaque fois. Si possible, je lirai tout le
fichier une seule fois, en mémoire, et je travaillerais en
mémoire.
--
James Kanze GABI Software http://www.gabi-soft.fr
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
|
|
|
| Back to top |
|
 |
Alexandre Guest
|
Posted: Tue Jan 25, 2005 7:30 pm Post subject: Re: erreur avec while eof ? |
|
|
bonjour,
"giovanni" <giovannisch (AT) hotmail (DOT) com> a écrit dans le message de news:
41f66857$1 (AT) ews20 (DOT) ..
| Quote: | j'ai essayer de mettre ca en memoire le prob maintenant avec tableau
comment savoir la taille max? que je peu cree et utiliser la memoire
dynamique comment faire
comme je sais pas la taille du fichier petit fichier ou gros fichier
|
tu peux utiliser les conteneurs standard, dans ton cas vector par ex...
Ici on lit l'intégralité des deux fichiers (pas le top s'ils font plusieurs
MO...) puis on les compare valeur par valeur
(je suppose que tes fichiers contient des int, si c'est autre chose tu
remplaces int par le type souhaité)
std::vector<int> Valeurs, Valeurs2;
std::ifstream Fichier("test.txt");
std::ifstream Fichier2("test2.txt");
int Valeur;
while(Fichier>>Valeur) {Valeurs.push_back(Valeur);}
while(Fichier2>>Valeur){Valeurs2.push_back(Valeur);}
bool Pareil;
if( Valeurs.size() != Valeur2.size() )
Pareil = false;
else
{
bool Fini=false;
Pareil = true;
int indice=0;
while(!Fini)
{
if(indice==Valeurs.size())
Fini=true;
else if( Valeurs[i] != Valeurs2[i] )
{
Pareil = false;
Fini = true;
}
else
i++;
}
}
à la fin de ce code, la variable Pareil vaudra true si les 2 fichiers
contiennt les mêmes entiers, false dans le cas contraire..
C'est ce que tu voulais ?
| Quote: | "giovanni" <giovannisch (AT) hotmail (DOT) com> a écrit dans le message de news:
41f6488e$1 (AT) ews20 (DOT) ..
ok mais escuse mais je tres debutant enfin en c++ j'arrive as encore
manier string pour ca fais fichier et pas en memoire enfin pour l 'nstant
pas trouver comment faire avec( while( fichier>>))
peu tu etre un peu plus d'info
[email]kanze (AT) gabi-soft (DOT) fr[/email]> a écrit dans le message de news:
[email]1106646706.217845.299620 (AT) c13g2000cwb (DOT) googlegroups.com[/email]...
giovanni wrote:
voila le while(!fichier.eof()) se fais mais mal me fais que
pause me affiche et le
while(!fichier2.eof()) lui affiche les printf...
je sais pas pourquoi
Pas besoin d'aller plus loin -- while avec la fonction eof() est
toujours une erreur.
Est-ce que tu as vérifié ce que fait la fonction eof() dans la
doc ? Parce que les noms des fonctions dans la norme sont
souvent trompeur (remove n'enlève rien, par exemple). En
l'occurance, la fonction ios::eof() n'indique rien en ce qui
concerne ce qui s'est passé à l'interface -- elle signifie qu'on
a vu une fin de fichier internalement, peut-être suite à une
lecture anticipée. L'idiome classique pour lire un fichier,
c'est :
while ( fichier >> dest ) ...
ou
while ( std::getline( fichier, ligne ) ) ...
donc ce programme compare une ligne (fichier) avec toute les
autre ligne du (fichier2) ensuite passe a la ligne suivante et
refais la meme chose merci
#include <cstdlib
#include
#include
#include
using namespace std;
int main()
{
ifstream fichier;
int nb_0, nb_1, nb_2, nb_3, nb_4, nb_5, nb_6, nb_7;
int ok_1, ok_2, ok_3, ok_4, ok_5, ok_6, ok_7, ok_8, ok_9;
ifstream fichier2;
int nb_00, nb_11,nb_22, nb_33,nb_44, nb_55, nb_66, nb_77;
ok_1=0;
fichier.open("text.txt", ios::in);
fichier2.open("text2.txt", ios::in);
if(fichier.bad())
if ( ! fichier ) ...
ou
if ( ! fichier.is_open() ) ...
Un échec lors de l'ouverture positionne fail, et non bad. (En
général, bad se réserve pour des erreurs « dure », une erreur
hardware lors d'une écriture, par exemple.)
return(1); // errore
if(fichier2.bad())
Comme ci-dessus.
return(1); // errore
while(!fichier.eof()){
while ( fichier >> ... ) {
fichier >> nb_0 >> nb_1 >> nb_2 >> nb_3>> nb_4 >> nb_5 >> nb_6
nb_7 ;
while(!fichier2.eof()){
while ( fichier2 >> ... ) {
Note qu'après la première fois dans la boucle exterieur, cette
condition sera toujours fausse. Si tu veux rélire le fichier2
pour chaque groupe d'entrées du fichier un, il faudrait quelque
chose comme :
fichier2.clear() ;
fichier2.gseek( std::ios::beg, 0 ) ;
après cette boucle. Mais ça risque d'être extrèmement lent,
rélire le fichier chaque fois. Si possible, je lirai tout le
fichier une seule fois, en mémoire, et je travaillerais en
mémoire.
--
James Kanze GABI Software http://www.gabi-soft.fr
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
|
|
|
| Back to top |
|
 |
Michel Michaud Guest
|
Posted: Wed Jan 26, 2005 1:35 am Post subject: Re: erreur avec while eof ? |
|
|
Dans le message 41f69fdd$0$22651$636a15ce (AT) news (DOT) free.fr,
Alexandre <alex.g (AT) netcourrier (DOT) com> a écrit :
| Quote: | std::vector<int> Valeurs, Valeurs2;
std::ifstream Fichier("test.txt");
std::ifstream Fichier2("test2.txt");
int Valeur;
while(Fichier>>Valeur) {Valeurs.push_back(Valeur);}
while(Fichier2>>Valeur){Valeurs2.push_back(Valeur);}
|
Il est plus direct (et plus savant ?) de faire
vector<int> valeurs(istream_iterator<int>(ifstream("test.txt")),
istream_iterator<int>());
etc.
Ça n'est pas toujours avantageux, mais c'est bon à savoir :-)
--
Michel Michaud [email]mm (AT) gdzid (DOT) com[/email]
http://www.gdzid.com
FAQ de fr.comp.lang.c++ :
http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ/
|
|
| Back to top |
|
 |
Gabriel Dos Reis Guest
|
Posted: Wed Jan 26, 2005 3:06 am Post subject: Re: erreur avec while eof ? |
|
|
"Michel Michaud" <mm (AT) gdzid (DOT) com> writes:
| Quote: | Dans le message 41f69fdd$0$22651$636a15ce (AT) news (DOT) free.fr,
Alexandre <alex.g (AT) netcourrier (DOT) com> a écrit :
std::vector<int> Valeurs, Valeurs2;
std::ifstream Fichier("test.txt");
std::ifstream Fichier2("test2.txt");
int Valeur;
while(Fichier>>Valeur) {Valeurs.push_back(Valeur);}
while(Fichier2>>Valeur){Valeurs2.push_back(Valeur);}
Il est plus direct (et plus savant ?) de faire
|
je ne sais pas si c'est savant, parce que cela ne fait aucun contrôle
sur l'entrée :-)
-- Gaby
|
|
| Back to top |
|
 |
Michel Michaud Guest
|
Posted: Wed Jan 26, 2005 4:32 am Post subject: Re: erreur avec while eof ? |
|
|
Dans le message [email]m3brbczy5p.fsf (AT) uniton (DOT) integrable-solutions.net[/email],
Gabriel Dos Reis <gdr (AT) integrable-solutions (DOT) net> a écrit :
| Quote: | "Michel Michaud" <mm (AT) gdzid (DOT) com> writes:
Il est plus direct (et plus savant ?) de faire
je ne sais pas si c'est savant, parce que cela ne fait aucun
contrôle sur l'entrée
|
Tiens, tu coupes les messages un peu trop serrés maintenant ? Je remets
ce que tu as coupé et qui confirmait ce que tu dis :
| Quote: | Ça n'est pas toujours avantageux,
|
(mais le code original ne contrôlait pas plus les erreurs...)
En fait, tant qu'à en parler, aussi bien dire que le mieux est
peut-être une solution intermédiaire, qui exposerait clairement le
flux qu'on peut alors tester :
ifstream f("test.txt");
// if (f.whatever()) si désiré
vector<int> valeurs(istream_iterator<int>(f),
istream_iterator<int>());
// Autres if si désirés, f est toujours disponible...
Et j'ajoute par ailleurs, qu'il est fort possible qu'une solution
avec boucles explicites (et contrôles d'erreurs) soient plus utiles
dans un programme « sérieux »...
--
Michel Michaud [email]mm (AT) gdzid (DOT) com[/email]
http://www.gdzid.com
FAQ de fr.comp.lang.c++ :
http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ/
|
|
| Back to top |
|
 |
Gabriel Dos Reis Guest
|
Posted: Wed Jan 26, 2005 7:49 am Post subject: Re: erreur avec while eof ? |
|
|
"Michel Michaud" <mm (AT) gdzid (DOT) com> writes:
| Quote: | Dans le message [email]m3brbczy5p.fsf (AT) uniton (DOT) integrable-solutions.net[/email],
Gabriel Dos Reis <gdr (AT) integrable-solutions (DOT) net> a écrit :
"Michel Michaud" <mm (AT) gdzid (DOT) com> writes:
Il est plus direct (et plus savant ?) de faire
je ne sais pas si c'est savant, parce que cela ne fait aucun
contrôle sur l'entrée :-)
Tiens, tu coupes les messages un peu trop serrés maintenant ? Je remets
|
Non.
| Quote: | ce que tu as coupé et qui confirmait ce que tu dis :
Ça n'est pas toujours avantageux,
|
oui, mais mon point était sur le « savant » ;-)
-- Gaby
|
|
| Back to top |
|
 |
giovanni Guest
|
Posted: Wed Jan 26, 2005 11:10 am Post subject: Re: erreur avec while eof ? |
|
|
je vais esayer donc ce que je cherche a faire c est qu il controle premiere
ligne du fichier 1 avec ligne 1 du fichier 2 me dire s il y a des difference
ou equivalence ensuite ligne 1 du fichier 1 toujours mais ligne du fichier 2
etc jusqua fin du fichier 2 ensuite reprendre ligne 2 du fichier 1 et
comparer a nouveau sve ligne 1 du fichier 2 etc ...
donc compare mais ligne pas vraiment fichier a fichier..
"Gabriel Dos Reis" <gdr (AT) integrable-solutions (DOT) net> a écrit dans le message de
news: [email]m3y8egy6hq.fsf (AT) uniton (DOT) integrable-solutions.net[/email]...
| Quote: | "Michel Michaud" <mm (AT) gdzid (DOT) com> writes:
| Dans le message [email]m3brbczy5p.fsf (AT) uniton (DOT) integrable-solutions.net[/email],
| Gabriel Dos Reis <gdr (AT) integrable-solutions (DOT) net> a écrit :
| > "Michel Michaud" <mm (AT) gdzid (DOT) com> writes:
| >> Il est plus direct (et plus savant ?) de faire
|
| > je ne sais pas si c'est savant, parce que cela ne fait aucun
| > contrôle sur l'entrée
|
| Tiens, tu coupes les messages un peu trop serrés maintenant ? Je remets
Non.
| ce que tu as coupé et qui confirmait ce que tu dis :
|
| > Ça n'est pas toujours avantageux,
oui, mais mon point était sur le « savant » ;-)
-- Gaby
|
|
|
| Back to top |
|
 |
kanze@gabi-soft.fr Guest
|
Posted: Wed Jan 26, 2005 1:29 pm Post subject: Re: erreur avec while eof ? |
|
|
giovanni wrote:
| Quote: | j'ai essayer de mettre ca en memoire le prob maintenant avec
tableau comment savoir la taille max? que je peu cree et
utiliser la memoire dynamique comment faire comme je sais pas
la taille du fichier petit fichier ou gros fichier
|
D'abord, il faudrait apprendre se servir du news -- on ne cite
pas tout un message, y compris les signatures, pour poser une
question qui n'a rien à voir ; quand on répond à un message, on
répond en-dessous la partie citée, en coupant tout ce qui n'est
pas nécessaire pour que la réponse soit compréhensible.
Ensuite, évidemment qu'on ne sait pas d'office la taille du
fichier. En C++, l'idiome le plus courant consiste à mettre les
données dans un std::vector, au moyen de push_back. Mais c'est
difficile à donner une règle générale ; en fait, tout dépend de
ce qu'on veut faire avec ces données. En fait, je dirais que la
première décision à prendre quand on écrit un programme, c'est
sur les données qu'on veut traiter et comment les organiser.
--
James Kanze GABI Software http://www.gabi-soft.fr
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
|
|
| Back to top |
|
 |
kanze@gabi-soft.fr Guest
|
Posted: Wed Jan 26, 2005 1:32 pm Post subject: Re: erreur avec while eof ? |
|
|
Michel Michaud wrote:
| Quote: | Dans le message 41f69fdd$0$22651$636a15ce (AT) news (DOT) free.fr,
Alexandre <alex.g (AT) netcourrier (DOT) com> a écrit :
std::vector<int> Valeurs, Valeurs2;
std::ifstream Fichier("test.txt");
std::ifstream Fichier2("test2.txt");
int Valeur;
while(Fichier>>Valeur) {Valeurs.push_back(Valeur);}
while(Fichier2>>Valeur){Valeurs2.push_back(Valeur);}
Il est plus direct (et plus savant ?) de faire
vector<int> valeurs(istream_iterator<int>(ifstream("test.txt")),
istream_iterator<int>());
etc.
|
Tout dépend du cahier de charges, mais j'ai du mal à voir un cas
où le code ci-dessus serait acceptable. Au minimum, on aimerait
un message d'erreur si on n'arrive pas à ouvrir "test.txt".
--
James Kanze GABI Software http://www.gabi-soft.fr
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
|
|
| Back to top |
|
 |
kanze@gabi-soft.fr Guest
|
Posted: Wed Jan 26, 2005 1:41 pm Post subject: Re: erreur avec while eof ? |
|
|
Michel Michaud wrote:
| Quote: | Dans le message
[email]m3brbczy5p.fsf (AT) uniton (DOT) integrable-solutions.net[/email], Gabriel Dos
Reis <gdr (AT) integrable-solutions (DOT) net> a écrit :
"Michel Michaud" <mm (AT) gdzid (DOT) com> writes:
Il est plus direct (et plus savant ?) de faire
je ne sais pas si c'est savant, parce que cela ne fait aucun
contrôle sur l'entrée :-)
Tiens, tu coupes les messages un peu trop serrés maintenant ?
Je remets ce que tu as coupé et qui confirmait ce que tu dis :
Ça n'est pas toujours avantageux,
(mais le code original ne contrôlait pas plus les erreurs...)
|
Et tu veux l'encourager dans ses erreurs:-).
| Quote: | En fait, tant qu'à en parler, aussi bien dire que le mieux est
peut-être une solution intermédiaire, qui exposerait
clairement le flux qu'on peut alors tester :
ifstream f("test.txt");
// if (f.whatever()) si désiré
vector<int> valeurs(istream_iterator<int>(f),
istream_iterator<int>());
|
Et ça lui sert à quoi, de déclarer une fonction extern qu'il
n'appelle jamais ?
| Quote: | // Autres if si désirés, f est toujours disponible...
Et j'ajoute par ailleurs, qu'il est fort possible qu'une
solution avec boucles explicites (et contrôles d'erreurs)
soient plus utiles dans un programme « sérieux »...
|
Tout dépend. Je suis assez sceptique en ce qui concerne
l'utilisation des istream_iterator sur des types de base, pour
lire un fichier extern. En revanche, pour lire un stringstream
qu'on a extrait d'un fichier extern, ou pour lire un type
utilisateur (disons une entrée dans un fichier de propriétés,
avec une conversion implicite en std::map< std::string,
std::string >::value_type), surtout avec un streambuf filtrant
pour traiter les commentaires et les lignes de continuation, je
n'en dis pas. (Mais je crois que le posteur initial n'en est pas
là.)
--
James Kanze GABI Software http://www.gabi-soft.fr
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
|
|
| Back to top |
|
 |
kanze@gabi-soft.fr Guest
|
Posted: Wed Jan 26, 2005 2:01 pm Post subject: Re: erreur avec while eof ? |
|
|
giovanni wrote:
| Quote: | je vais esayer donc ce que je cherche a faire c est qu il
controle premiere ligne du fichier 1 avec ligne 1 du fichier 2
me dire s il y a des difference ou equivalence ensuite ligne 1
du fichier 1 toujours mais ligne du fichier 2 etc jusqua fin
du fichier 2 ensuite reprendre ligne 2 du fichier 1 et
comparer a nouveau sve ligne 1 du fichier 2 etc ... donc
compare mais ligne pas vraiment fichier a fichier..
|
[Si tu essayais Un peu plus de ponctuation et des
majuscules, et un peu moins de fautes d'orthographe, la
lecture de tes postes serait énormement facilitée.]
La question la plus importante alors, c'est est-ce qu'il
pourrait être raisonable de tenir les fichiers (ou au moins un
des fichiers) en mémoire, parce que sinon, ça risque de ne pas
aller très vite, et il faudrait considérer des algorithmes
spéciaux pour l'accellérer. Si on peut se permettre de garder un
des fichiers en mémoire, quelque chose du genre :
std::vector f1( (std::istream_iterator< Line >( fichier1 )),
(std::istream_iterator< Line >()) ) ;
Line tmp ;
while ( fichier2 >> tmp ) {
if ( std::find( f1.begin(), f1.end(), Matcher( tmp ) ) ) {
// ...
}
}
me semble la solution indiquée. Après, reste à toi de définir
Line et Matcher comme il faut (mais ça ne doit pas être trop
difficile).
La seule faiblesse que je vois avec cette solution, c'est
qu'elle s'arrêtera sur la première ligne avec une erreur de
format, plutôt que de le sauter. C'est possible de résoudre ce
problème dans le operator>> pour Line ; c'est un peu un abus, au
moins dans le cas général, mais c'est parfois acceptable dans
des tout petits programmes comme celui-ci.
--
James Kanze GABI Software http://www.gabi-soft.fr
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
|
|
| Back to top |
|
 |
giovanni Guest
|
Posted: Wed Jan 26, 2005 5:51 pm Post subject: Re: erreur avec while eof ? |
|
|
ok je vais voir en tout cas merci du coup de main si j'ai un prob je ferais
un news mais je pense cette fois y arriver...
je suis debutant en c++ mais en pascal ou vb je me debrouille un peu mieux
que c++ et comme gratuit en plus dev c++ ....
<kanze (AT) gabi-soft (DOT) fr> a écrit dans le message de news:
[email]1106746144.339617.224120 (AT) c13g2000cwb (DOT) googlegroups.com[/email]...
giovanni wrote:
| Quote: | j'ai essayer de mettre ca en memoire le prob maintenant avec
tableau comment savoir la taille max? que je peu cree et
utiliser la memoire dynamique comment faire comme je sais pas
la taille du fichier petit fichier ou gros fichier
|
D'abord, il faudrait apprendre se servir du news -- on ne cite
pas tout un message, y compris les signatures, pour poser une
question qui n'a rien à voir ; quand on répond à un message, on
répond en-dessous la partie citée, en coupant tout ce qui n'est
pas nécessaire pour que la réponse soit compréhensible.
Ensuite, évidemment qu'on ne sait pas d'office la taille du
fichier. En C++, l'idiome le plus courant consiste à mettre les
données dans un std::vector, au moyen de push_back. Mais c'est
difficile à donner une règle générale ; en fait, tout dépend de
ce qu'on veut faire avec ces données. En fait, je dirais que la
première décision à prendre quand on écrit un programme, c'est
sur les données qu'on veut traiter et comment les organiser.
--
James Kanze GABI Software http://www.gabi-soft.fr
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
|
|
| Back to top |
|
 |
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
|