 |
C++Talk.NET C++ language newsgroups
|
| View previous topic :: View next topic |
| Author |
Message |
Laurent Guest
|
Posted: Thu Jan 08, 2004 5:23 pm Post subject: Visual C++ 6.0 ; debug ; fichier |
|
|
c'est simple, ce programme fonctionne normallement sans debug, et en debug,
il me trouve un eof() des le premier input.read()
JE NE COMPRENDS PAS !!!!!!!!!!!
merci.
#include <iostream.h>
#include <fstream.h>
#include <stdio.h>
void main(void)
{
ifstream input;
char Carac[1];
int Taille;
input.open("fichier.txt",ios::in);
do
{
input.read(Carac, sizeof(Carac));
if(input.good())
{
Taille++;
}
}
while(!input.eof());
cout << "Taille : " << Taille << " octets.";
}
|
|
| Back to top |
|
 |
Thomas Abbé Guest
|
Posted: Thu Jan 08, 2004 5:49 pm Post subject: Re: Visual C++ 6.0 ; debug ; fichier |
|
|
si tu veux avoir la taille dun fichier,
regarde dans la documentation sous "seek"
thomas
"Laurent" <lthermy (AT) wanadoo (DOT) fr> schrieb:
| Quote: | c'est simple, ce programme fonctionne normallement sans debug, et en
debug,
il me trouve un eof() des le premier input.read()
JE NE COMPRENDS PAS !!!!!!!!!!!
merci.
#include
#include
#include
void main(void)
{
ifstream input;
char Carac[1];
int Taille;
input.open("fichier.txt",ios::in);
do
{
input.read(Carac, sizeof(Carac));
if(input.good())
{
Taille++;
}
}
while(!input.eof());
cout << "Taille : " << Taille << " octets.";
}
|
|
|
| Back to top |
|
 |
Loïc Joly Guest
|
Posted: Thu Jan 08, 2004 10:12 pm Post subject: Re: Visual C++ 6.0 ; debug ; fichier |
|
|
Thomas Abbé wrote:
| Quote: | si tu veux avoir la taille dun fichier,
regarde dans la documentation sous "seek"
|
Ca ne donnerait pas grand-chose : La valeur retournée par un seek n'a
pas forcément le moindre lien avec la taille (ni même avec un nombre, je
crois ?)
--
Loïc
|
|
| Back to top |
|
 |
Thomas Abbé Guest
|
Posted: Thu Jan 08, 2004 11:44 pm Post subject: Re: Visual C++ 6.0 ; debug ; fichier |
|
|
oui et non.
FILE *f
fseek(f,0,SEEK_END);
int filesize = ftell(f);
et voila ;)
thomas
"Loïc Joly" <loic.actarus.joly (AT) wanadoo (DOT) fr> schrieb:
| Quote: | Thomas Abbé wrote:
si tu veux avoir la taille dun fichier,
regarde dans la documentation sous "seek"
Ca ne donnerait pas grand-chose : La valeur retournée par un seek n'a
pas forcément le moindre lien avec la taille (ni même avec un nombre, je
crois ?)
--
Loïc
|
|
|
| Back to top |
|
 |
Régis Troadec Guest
|
Posted: Fri Jan 09, 2004 12:25 am Post subject: Re: Visual C++ 6.0 ; debug ; fichier |
|
|
Salut,
"Laurent" <lthermy (AT) wanadoo (DOT) fr> a écrit dans le message de news:
btk39j$l34$1 (AT) news-reader4 (DOT) wanadoo.fr...
| Quote: | c'est simple, ce programme fonctionne normallement sans debug, et en
debug,
il me trouve un eof() des le premier input.read()
JE NE COMPRENDS PAS !!!!!!!!!!!
merci.
|
le "ça marche pas en debug mais autrement oui" sous Visual reste vague dans
ton post : qu'entends-tu par là ? Lances-tu l'exécutable du dossier de la
version debug (par rapport à celui de la release), auquel cas "fichier.txt"
n'y est peut-être pas présent ?
| Quote: | #include <iostream.h
#include
#include
|
headers superflus :
#include inclus avec fstream
#include <stdio.h> => bon pour les E/S C, pas ici
| Quote: | void main(void)
{
ifstream input;
char Carac[1];
int Taille;
|
Taille non initialisée => int Taille = 0;
char Carac[1] pas très élégant => char Carac; // voir plus loin
ouverture de flux plus simple (ios::in est par defaut) => ifstream
input("fichier.txt"); // open à virer en dessous
| Quote: | input.open("fichier.txt",ios::in);
do
{
input.read(Carac, sizeof(Carac));
if(input.good())
{
Taille++;
}
}
while(!input.eof());
|
=> Tester si flux bien ouvert avant et prevoir une gestion sinon:
=> get (lit 1 caractère) plus facile que read (utilisé plutôt pour flux
binaire), sinon => input.read(&Carac, sizeof(Carac));
=> test dans boucle peu élégant
Je te propose :
if( input ) {
while ( input.good() ) { // tt que eof non atteinte ou pas
d'erreur
input.get( Carac ); // lit 1 caractere
Taille++; // incr
}
}
else {
cout << "blabla..." << endl;
}
| Quote: | cout << "Taille : " << Taille << " octets.";
}
|
Et voilà.
|
|
| Back to top |
|
 |
Michel Michaud Guest
|
Posted: Fri Jan 09, 2004 4:49 am Post subject: Re: Visual C++ 6.0 ; debug ; fichier |
|
|
Dans news:btkri2$3g5$1 (AT) news-reader3 (DOT) wanadoo.fr, Régis
Troadec <regt (AT) wanadoo (DOT) fr> a écrit :
| Quote: | Je te propose :
if( input ) {
while ( input.good() ) { // tt que eof non atteinte
ou pas d'erreur
input.get( Carac ); // lit 1 caractere
Taille++; // incr
}
|
Ça c'est à peu près certain de ne pas fonctionner. Il faut tester
après le get pour savoir si un caractère a été lu.
La technique de lecture en C++ (et en fait, c'est similaire en C)
a été montrée de nombreuses fois ici. Rappelons-la symboliquement :
while ( lecture ) // Combinaison de lecture et de test
{ // de la réussite
on a réussi à lire, on peut utiliser la donnée lue
}
Par exemple ici :
while (input.get(carac))
++taille;
--
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 |
|
 |
Régis Troadec Guest
|
Posted: Fri Jan 09, 2004 11:47 am Post subject: Re: Visual C++ 6.0 ; debug ; fichier |
|
|
C'est vrai et ta solution est plus commode.
Mais pourquoi donc le fait d'utiliser ios_base::good() ne garantirait pas
que
l'opération suivante soit réussie ? (De même, ios_base::fail() ne
garantirait-il pas que
l'opération suivante échoue ?)
Régis
"Michel Michaud" <mm (AT) gdzid (DOT) com> a écrit dans le message de news:
SpqLb.83898$BA6.1755835 (AT) news20 (DOT) bellglobal.com...
| Quote: | Dans news:btkri2$3g5$1 (AT) news-reader3 (DOT) wanadoo.fr, Régis
Troadec <regt (AT) wanadoo (DOT) fr> a écrit :
Je te propose :
if( input ) {
while ( input.good() ) { // tt que eof non atteinte
ou pas d'erreur
input.get( Carac ); // lit 1 caractere
Taille++; // incr
}
Ça c'est à peu près certain de ne pas fonctionner. Il faut tester
après le get pour savoir si un caractère a été lu.
La technique de lecture en C++ (et en fait, c'est similaire en C)
a été montrée de nombreuses fois ici. Rappelons-la symboliquement :
while ( lecture ) // Combinaison de lecture et de test
{ // de la réussite
on a réussi à lire, on peut utiliser la donnée lue
}
Par exemple ici :
while (input.get(carac))
++taille;
--
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 |
|
 |
Jean-Marc Bourguet Guest
|
Posted: Fri Jan 09, 2004 12:08 pm Post subject: Re: Visual C++ 6.0 ; debug ; fichier |
|
|
"Régis Troadec" <regt (AT) wanadoo (DOT) fr> writes:
| Quote: | C'est vrai et ta solution est plus commode.
Mais pourquoi donc le fait d'utiliser ios_base::good() ne
garantirait pas que l'opération suivante soit réussie ? (De même,
ios_base::fail() ne garantirait-il pas que l'opération suivante
échoue ?)
|
Parce que good() indique que l'operation precedente a reussit et
fail() qu'elle a echoue.
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
|
|
| Back to top |
|
 |
Thomas Abbé Guest
|
Posted: Fri Jan 09, 2004 12:13 pm Post subject: Re: Visual C++ 6.0 ; debug ; fichier |
|
|
donc
if( input ) {
while ( input.good() ) { // tt que eof non atteinte
input.get( Carac ); // lit 1 caractere
if (input)
Taille++; // incr
}
thomas
|
|
| Back to top |
|
 |
kanze@gabi-soft.fr Guest
|
Posted: Fri Jan 09, 2004 1:52 pm Post subject: Re: Visual C++ 6.0 ; debug ; fichier |
|
|
Thomas Abbé <thomas_abbe (AT) hotmail (DOT) com> wrote
| Quote: | oui et non.
FILE *f
fseek(f,0,SEEK_END);
int filesize = ftell(f);
et voila
|
Sauf qu'en général, la taille d'un fichier ne tient pas sur un int. Si
le fseek est assez sûr, le ftell pourrait renvoyer n'importe quoi. Pour
déterminer la position dans un fichier, la fonction consacré par la
norme C, c'est fgetpos. Et la position est renvoyée dans un fpos_t, qui
n'est pas forcement un type numérique.
Même dans le cas des fichiers dont la taille tient sur un int, la norme
C spécifie « For a text stream, its file position indicator contains
unspecified information, usable by the fseek function for returning the
file position indicator for the stream to its position at the time of
the ftell call; the difference between two such return values is not
necessarily a meaninfgul measure of the number of characters written or
read. »
Si on veut déterminer la taille d'un fichier, il faut d'abord définir ce
qu'on veut dire par la taille. Si c'est la place que le fichier occupe
sur disque, ça serait une chose (et la valeur serait toujours un
multiple entier de la taille d'un bloc d'allocation). Si c'est le nombre
de char qu'on peut lire, la valeur serait d'autre chose, et sur la
plupart de systèmes non-Unix, au moins en ce qui concerne les fichiers
de texte, il n'y a aucune façon à la determiner *sauf* lire le fichier
complètement.
Mais le poster original ne disait pas qu'il voulait savoir la taille.
--
James Kanze GABI Software mailto:kanze (AT) gabi-soft (DOT) fr
Conseils en informatique orientée objet/ http://www.gabi-soft.fr
Beratung in objektorientierter Datenverarbeitung
11 rue de Rambouillet, 78460 Chevreuse, France, +33 (0)1 30 23 45 16
|
|
| Back to top |
|
 |
kanze@gabi-soft.fr Guest
|
Posted: Fri Jan 09, 2004 2:09 pm Post subject: Re: Visual C++ 6.0 ; debug ; fichier |
|
|
"Laurent" <lthermy (AT) wanadoo (DOT) fr> wrote
| Quote: | c'est simple, ce programme fonctionne normallement sans debug, et en
debug, il me trouve un eof() des le premier input.read()
|
Si le fichier ne contient qu'un seul caractère, c'est possible. Sinon,
je ne l'explique pas.
| Quote: | JE NE COMPRENDS PAS !!!!!!!!!!!
#include <iostream.h
#include
#include
void main(void)
|
En général, la norme exige que main renvoie int, même si certains
compilateurs accepte void main.
| Quote: | {
ifstream input;
char Carac[1];
int Taille;
input.open("fichier.txt",ios::in);
|
C'est préférable de vérifier si le open a fonctionné ou non.
| Quote: | do
{
input.read(Carac, sizeof(Carac));
if(input.good())
|
Dans la pratique, ios::good() ne sert à rien. S'il renvoie faux, on sait
que la lecture prochaine échouera ; on ne sait toujours pas si la
dernière lecture a réussie ou non. S'il renvoie vrai, on sait que la
dernière lecture a réussie, mais on ne sait rien sur la prochaine.
| Quote: | {
Taille++;
}
}
while(!input.eof());
|
Ici aussi : ios::eof n'a d'intérêt qu'après un échec, et encore (parce
que c'est facile à construire des cas où il est vrai alors, bien que
l'échec soit dû à une erreur de formattage des données).
En général, le eofbit (que renvoie ios::eof, et qui entre dans les
conditions de good) est vrai si le flux a vu la fin de fichier
internalement, y compris s'il l'a vue lors d'un « look ahead ». Si le
bit est faux, tu ne peux pas dire grand chose (sauf qu'on n'a pas
terminé la dernière lecture à cause d'une fin de fichier). S'il est
vrai, tout ce qu'on peut dire de certain, c'est que la prochaine lecture
verait une fin de fichier (et donc échouerait).
La boucle idiomatique pour faire ce que tu fais ici, c'est :
while ( input.get( Charac[ 0 ] ) ) {
++ Taille ;
}
ou
while ( intput.get() != EOF ) {
++ Taille ;
}
Ce n'est pas beau, mais c'est tellement entré dans les moeurs que
quelque chose d'autre fait poser la question pourquoi. Si tu tiens à
utiliser des fonctions separées pour chaque opération :
input.get( Charac ) ;
while ( ! input.fail() ) {
++ Taille ;
input.get( Charac ) ;
}
Dans l'abstrait, c'est l'idiome que je préfère, mais comme j'ai dit,
c'est tellement peu courant que ça fait poser la question pourquoi. Le
fait d'utiliser quelque chose d'autre que l'idiome consacré dit au
lecteur que tu voulais faire quelque chose de spécial.
Les seuls cas où l'utilisation de ios::eof se justifie, c'est après des
lectures formattées, par exemple :
double d ;
while ( input >> d ) {
faisQuelqueChoseAvec( d ) ;
}
if ( ! input.eof() ) {
errorDeFormatEnEntree() ;
}
Là aussi, il s'agit d'un idiome consacré. Qui malheureusement ne marche
pas de façon robuste -- essaie par exemple sur un fichier qui contient
"1.2e+" (sans 'n' à la fin) : c'est bien une erreur de format qui a
provoquer l'arrêt de la lecture, mais sur toutes les implémentations que
je connais, on ne trouve pas d'erreur de format (et ces implémentations
sont bien conforme à la norme).
| Quote: | cout << "Taille : " << Taille << " octets.";
}
|
Et tu sors de ton programme avec une ligne incomplète ?
--
James Kanze GABI Software mailto:kanze (AT) gabi-soft (DOT) fr
Conseils en informatique orientée objet/ http://www.gabi-soft.fr
Beratung in objektorientierter Datenverarbeitung
11 rue de Rambouillet, 78460 Chevreuse, France, +33 (0)1 30 23 45 16
|
|
| Back to top |
|
 |
Michel Michaud Guest
|
Posted: Fri Jan 09, 2004 4:38 pm Post subject: Re: Visual C++ 6.0 ; debug ; fichier |
|
|
Dans news:btm5nt$if1$1 (AT) news (DOT) tu-darmstadt.de, Thomas
Abbé <thomas_abbe (AT) hotmail (DOT) com> a écrit :
| Quote: | donc
if( input ) {
while ( input.good() ) { // tt que eof non atteinte
|
Moi, je réagis fortement (et négativement) quand mes
élèves prennent la peine d'écrire un commentaire et qu'il
ne correspond pas à ce qu'il commente !!! Le if est
par ailleurs inutile...
--
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 |
|
 |
Michel Michaud Guest
|
Posted: Fri Jan 09, 2004 4:42 pm Post subject: Re: Visual C++ 6.0 ; debug ; fichier |
|
|
Dans news:d6652001.0401090552.1d055c8f (AT) posting (DOT) google.com,
[email]kanze (AT) gabi-soft (DOT) fr[/email] <kanze (AT) gabi-soft (DOT) fr> a écrit :
| Quote: | Sauf qu'en général, la taille d'un fichier ne tient pas sur un int.
Si le fseek est assez sûr, le ftell pourrait renvoyer n'importe
quoi. Pour déterminer la position dans un fichier, la fonction
|
Est-ce que ça a changé récemment ? Je lis ceci dans la norme C89
(la seule norme C que j'ai et il me semble celle sur laquelle est
basé C++) :
The ftell function obtains the current value of the file position
indicator [...]. For a binary stream, the value is the number of
characters from the beginning of the file. [...]
Il me semble donc qu'avec un stream en mode binaire, ça fonctionne
pas si mal. Et ftell renvoie un long par ailleur...
--
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 |
|
 |
kanze@gabi-soft.fr Guest
|
Posted: Fri Jan 09, 2004 5:36 pm Post subject: Re: Visual C++ 6.0 ; debug ; fichier |
|
|
"Régis Troadec" <regt (AT) wanadoo (DOT) fr> wrote
| Quote: | "Laurent" <lthermy (AT) wanadoo (DOT) fr> a écrit dans le message de news:
btk39j$l34$1 (AT) news-reader4 (DOT) wanadoo.fr...
c'est simple, ce programme fonctionne normallement sans debug, et en
debug, il me trouve un eof() des le premier input.read()
JE NE COMPRENDS PAS !!!!!!!!!!!
le "ça marche pas en debug mais autrement oui" sous Visual reste vague
dans ton post : qu'entends-tu par là ?
|
Qu'il trouve un eof() dès le premier input.read(), j'imagine. C'est ce
qu'il a dit, de toute façon.
| Quote: | Lances-tu l'exécutable du dossier de la version debug (par rapport à
celui de la release), auquel cas "fichier.txt" n'y est peut-être pas
présent ?
|
Je suppose qu'il a assez de bon sens pour d'abord vérifier qu'il a
lancé les deux versions depuis le même répertoire, et que le fichier à
ouvrir était bien présent.
| Quote: | #include <iostream.h
#include
#include
headers superflus :
#include inclus avec fstream
|
Peut-être. En fait, je vois mal comment on pourrait implémenter
fstream.h sans inclure iostream.h, mais formellement, il n'y a aucune
garantie. En tout cas, c'est en général considéré une bonne pratique
d'include tout ce dont on a besoin, même quand on le sait inclu
indirectement.
| Quote: | #include <stdio.h> => bon pour les E/S C, pas ici
|
En général (et ici), oui, mais il ne faut pas oublier que c'est toujours
dans <stdio.h> (ou <cstdio>) que sont définis remove et rename.
| Quote: | void main(void)
{
ifstream input;
char Carac[1];
int Taille;
Taille non initialisée => int Taille = 0;
|
Pas du tout. Taille non initialisée implique Taille non initialisée. La
première lecture en donne un comportement indéfini. Typiquement, tu as
simplement une valeur au hazard. En mode debug, un bon compilateur
pourrait l'initialiser avec quelque chose de marquant (0xdeadbeef a une
certaine popularité). Voire même y associer un flag caché qu'il teste
avant la lecture, pour générer une erreur (échec d'assertion) dans le
cas d'un accès sans écriture préalable.
Dans un cas aussi simple que ceci, j'imagine que la plupart des
compilateur donnerait un avertissement, au moins si on a activé
l'optimisation (pour qu'ils fassent l'analyse de flux nécessaire).
| Quote: | char Carac[1] pas très élégant => char Carac; // voir plus loin
|
Tout à fait d'accord. J'ai supposé (peut-être à tort, mais je donne
toujours la bénéfice de la doute) qu'il avait commencé avec quelque
chose de plus compliqué, avec peut-être un buffer plus grand, et que le
[1] était le résultat d'avoir simplifier.
| Quote: | ouverture de flux plus simple (ios::in est par defaut) => ifstream
input("fichier.txt"); // open à virer en dessous
|
En somme, tu sais qu'il y a des choses qui se passe derrier ton dos,
mais tu ne veux surtout pas que le lecteur le sache. Dans ce cas-ci, on
peut supposer évidemment que le lecteur sache aussi ce que fait
ifstream, et donc, qu'il n'y a pas vraiment dissimilation. Bien que, vue
la question, et ta réponse...
| Quote: | input.open("fichier.txt",ios::in);
do
{
input.read(Carac, sizeof(Carac));
if(input.good())
{
Taille++;
}
}
while(!input.eof());
=> Tester si flux bien ouvert avant et prevoir une gestion sinon:
|
Il n'y a pas de sinon. Le traitement d'un fichier qu'on ne peut pas
ouvrir n'est pas le même que le traitement d'un fichier vide.
| Quote: | => get (lit 1 caractère) plus facile que read (utilisé plutôt pour flux
binaire), sinon => input.read(&Carac, sizeof(Carac));
|
Moi, aussi, si on lit caractère par caractère, j'utiliserais get.
Quant à binary, il faudrait d'abord savoir ce qu'il veut faire.
| Quote: | => test dans boucle peu élégant
|
Mais fréquent. Il n'y a pas de solution élégante, en fait. C'est
pourquoi la question se trouve discutée si souvent.
| Quote: | Je te propose :
if( input ) {
while ( input.good() ) { // tt que eof non atteinte ou pas
d'erreur
|
Comme j'ai indiqué par ailleurs, ios::good() est une fonction sans la
moindre utilité.
| Quote: | input.get( Carac ); // lit 1 caractere
Taille++; // incr
|
Et si la lecture échoue ? Ce qui va arriver forcement à la fin. Tu
compte un de trop.
| Quote: | }
}
else {
cout << "blabla..." << endl;
}
cout << "Taille : " << Taille << " octets.";
}
Et voilà.
|
Tu l'as testé ? Y compris vérifié que le résultat était juste ?
--
James Kanze GABI Software mailto:kanze (AT) gabi-soft (DOT) fr
Conseils en informatique orientée objet/ http://www.gabi-soft.fr
Beratung in objektorientierter Datenverarbeitung
11 rue de Rambouillet, 78460 Chevreuse, France, +33 (0)1 30 23 45 16
|
|
| Back to top |
|
 |
Régis Troadec Guest
|
Posted: Fri Jan 09, 2004 10:31 pm Post subject: Re: Visual C++ 6.0 ; debug ; fichier |
|
|
<kanze (AT) gabi-soft (DOT) fr> a écrit dans le message de news:
[email]d6652001.0401090936.497398d1 (AT) posting (DOT) google.com[/email]...
| Quote: | "Régis Troadec" <regt (AT) wanadoo (DOT) fr> wrote in message
news:<btkri2$3g5$1 (AT) news-reader3 (DOT) wanadoo.fr>...
"Laurent" <lthermy (AT) wanadoo (DOT) fr> a écrit dans le message de news:
btk39j$l34$1 (AT) news-reader4 (DOT) wanadoo.fr...
c'est simple, ce programme fonctionne normallement sans debug, et en
debug, il me trouve un eof() des le premier input.read()
JE NE COMPRENDS PAS !!!!!!!!!!!
le "ça marche pas en debug mais autrement oui" sous Visual reste vague
dans ton post : qu'entends-tu par là ?
Qu'il trouve un eof() dès le premier input.read(), j'imagine. C'est ce
qu'il a dit, de toute façon.
Lances-tu l'exécutable du dossier de la version debug (par rapport à
celui de la release), auquel cas "fichier.txt" n'y est peut-être pas
présent ?
Je suppose qu'il a assez de bon sens pour d'abord vérifier qu'il a
lancé les deux versions depuis le même répertoire, et que le fichier à
ouvrir était bien présent.
#include <iostream.h
#include
#include
headers superflus :
#include inclus avec fstream
Peut-être. En fait, je vois mal comment on pourrait implémenter
fstream.h sans inclure iostream.h, mais formellement, il n'y a aucune
garantie. En tout cas, c'est en général considéré une bonne pratique
d'include tout ce dont on a besoin, même quand on le sait inclu
indirectement.
#include <stdio.h> => bon pour les E/S C, pas ici
En général (et ici), oui, mais il ne faut pas oublier que c'est toujours
dans <stdio.h> (ou <cstdio>) que sont définis remove et rename.
void main(void)
{
ifstream input;
char Carac[1];
int Taille;
Taille non initialisée => int Taille = 0;
Pas du tout. Taille non initialisée implique Taille non initialisée. La
première lecture en donne un comportement indéfini. Typiquement, tu as
simplement une valeur au hazard. En mode debug, un bon compilateur
pourrait l'initialiser avec quelque chose de marquant (0xdeadbeef a une
certaine popularité). Voire même y associer un flag caché qu'il teste
avant la lecture, pour générer une erreur (échec d'assertion) dans le
cas d'un accès sans écriture préalable.
|
Oui, d'accord car de toute façon, il s'agit d'une déclaration ET d'une
définition, mais en affectant une valeur dès le départ, la recherche
d'erreurs s'en trouve facilitée
| Quote: |
Dans un cas aussi simple que ceci, j'imagine que la plupart des
compilateur donnerait un avertissement, au moins si on a activé
l'optimisation (pour qu'ils fassent l'analyse de flux nécessaire).
char Carac[1] pas très élégant => char Carac; // voir plus loin
Tout à fait d'accord. J'ai supposé (peut-être à tort, mais je donne
toujours la bénéfice de la doute) qu'il avait commencé avec quelque
chose de plus compliqué, avec peut-être un buffer plus grand, et que le
[1] était le résultat d'avoir simplifier.
ouverture de flux plus simple (ios::in est par defaut) => ifstream
input("fichier.txt"); // open à virer en dessous
En somme, tu sais qu'il y a des choses qui se passe derrier ton dos,
mais tu ne veux surtout pas que le lecteur le sache. Dans ce cas-ci, on
peut supposer évidemment que le lecteur sache aussi ce que fait
ifstream, et donc, qu'il n'y a pas vraiment dissimilation. Bien que, vue
la question, et ta réponse...
input.open("fichier.txt",ios::in);
do
{
input.read(Carac, sizeof(Carac));
if(input.good())
{
Taille++;
}
}
while(!input.eof());
=> Tester si flux bien ouvert avant et prevoir une gestion sinon:
Il n'y a pas de sinon. Le traitement d'un fichier qu'on ne peut pas
ouvrir n'est pas le même que le traitement d'un fichier vide.
=> get (lit 1 caractère) plus facile que read (utilisé plutôt pour flux
binaire), sinon => input.read(&Carac, sizeof(Carac));
Moi, aussi, si on lit caractère par caractère, j'utiliserais get.
Quant à binary, il faudrait d'abord savoir ce qu'il veut faire.
=> test dans boucle peu élégant
Mais fréquent. Il n'y a pas de solution élégante, en fait. C'est
pourquoi la question se trouve discutée si souvent.
Je te propose :
if( input ) {
while ( input.good() ) { // tt que eof non atteinte ou pas
d'erreur
Comme j'ai indiqué par ailleurs, ios::good() est une fonction sans la
moindre utilité.
input.get( Carac ); // lit 1 caractere
Taille++; // incr
Et si la lecture échoue ? Ce qui va arriver forcement à la fin. Tu
compte un de trop.
}
}
else {
cout << "blabla..." << endl;
}
cout << "Taille : " << Taille << " octets.";
}
Et voilà.
Tu l'as testé ? Y compris vérifié que le résultat était juste ?
--
James Kanze GABI Software mailto:kanze (AT) gabi-soft (DOT) fr
Conseils en informatique orientée objet/ http://www.gabi-soft.fr
Beratung in objektorientierter Datenverarbeitung
11 rue de Rambouillet, 78460 Chevreuse, France, +33 (0)1 30 23 45 16
|
|
|
| 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
|
|