C++Talk.NET Forum Index C++Talk.NET
C++ language newsgroups
 
Archives   FAQFAQ   SearchSearch   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

Visual C++ 6.0 ; debug ; fichier
Goto page 1, 2  Next
 
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (French)
View previous topic :: View next topic  
Author Message
Laurent
Guest





PostPosted: Thu Jan 08, 2004 5:23 pm    Post subject: Visual C++ 6.0 ; debug ; fichier Reply with 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 <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





PostPosted: Thu Jan 08, 2004 5:49 pm    Post subject: Re: Visual C++ 6.0 ; debug ; fichier Reply with quote



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





PostPosted: Thu Jan 08, 2004 10:12 pm    Post subject: Re: Visual C++ 6.0 ; debug ; fichier Reply with quote



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





PostPosted: Thu Jan 08, 2004 11:44 pm    Post subject: Re: Visual C++ 6.0 ; debug ; fichier Reply with quote

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





PostPosted: Fri Jan 09, 2004 12:25 am    Post subject: Re: Visual C++ 6.0 ; debug ; fichier Reply with quote

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





PostPosted: Fri Jan 09, 2004 4:49 am    Post subject: Re: Visual C++ 6.0 ; debug ; fichier Reply with quote

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





PostPosted: Fri Jan 09, 2004 11:47 am    Post subject: Re: Visual C++ 6.0 ; debug ; fichier Reply with 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 ?)

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





PostPosted: Fri Jan 09, 2004 12:08 pm    Post subject: Re: Visual C++ 6.0 ; debug ; fichier Reply with quote

"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





PostPosted: Fri Jan 09, 2004 12:13 pm    Post subject: Re: Visual C++ 6.0 ; debug ; fichier Reply with quote

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





PostPosted: Fri Jan 09, 2004 1:52 pm    Post subject: Re: Visual C++ 6.0 ; debug ; fichier Reply with quote

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 Wink

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





PostPosted: Fri Jan 09, 2004 2:09 pm    Post subject: Re: Visual C++ 6.0 ; debug ; fichier Reply with quote

"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





PostPosted: Fri Jan 09, 2004 4:38 pm    Post subject: Re: Visual C++ 6.0 ; debug ; fichier Reply with quote

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





PostPosted: Fri Jan 09, 2004 4:42 pm    Post subject: Re: Visual C++ 6.0 ; debug ; fichier Reply with quote

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





PostPosted: Fri Jan 09, 2004 5:36 pm    Post subject: Re: Visual C++ 6.0 ; debug ; fichier Reply with quote

"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





PostPosted: Fri Jan 09, 2004 10:31 pm    Post subject: Re: Visual C++ 6.0 ; debug ; fichier Reply with quote


<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
Display posts from previous:   
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (French) All times are GMT
Goto page 1, 2  Next
Page 1 of 2

 
Jump to:  
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


Powered by phpBB © 2001, 2006 phpBB Group
SEO toolkit © 2004-2006 webmedic.