Antoine Leca wrote:
Bonjour,
[...]
>
> En plus, il semble que bpascal étudie sur une machine Linux en s'aidant
> d'un livre écrit pour MSDOS. J'ai donc essayer d'attirer son attention
> sur le fait qu'il doive faire l'effort de s'abstraire à ce niveau.
> Et se concentrer sur les seules choses qui importent, sans chercher à
> essayer d'utiliser l'assembleur ou les tampons ou je-ne-sais-quoi.
>
Justement, quel livre (ou site) a par le K&R pour apprendre a programmer
en C sur Unix/Linux ?
Antoine Leca <root@localhost.invalid> wrote:
Bonjour,
[...]
>
> En plus, il semble que bpascal étudie sur une machine Linux en s'aidant
> d'un livre écrit pour MSDOS. J'ai donc essayer d'attirer son attention
> sur le fait qu'il doive faire l'effort de s'abstraire à ce niveau.
> Et se concentrer sur les seules choses qui importent, sans chercher à
> essayer d'utiliser l'assembleur ou les tampons ou je-ne-sais-quoi.
>
Justement, quel livre (ou site) a par le K&R pour apprendre a programmer
en C sur Unix/Linux ?
Antoine Leca wrote:
Bonjour,
[...]
>
> En plus, il semble que bpascal étudie sur une machine Linux en s'aidant
> d'un livre écrit pour MSDOS. J'ai donc essayer d'attirer son attention
> sur le fait qu'il doive faire l'effort de s'abstraire à ce niveau.
> Et se concentrer sur les seules choses qui importent, sans chercher à
> essayer d'utiliser l'assembleur ou les tampons ou je-ne-sais-quoi.
>
Justement, quel livre (ou site) a par le K&R pour apprendre a programmer
en C sur Unix/Linux ?
Samuel DEVULDER écrivit :Par ailleurs l'écriture suivante:
char c = (char)fgetc(FLUX);
if(feof(FLUX)) break;
Me semble claire, et assez proche des API des autres langages qui ont
une fonctionnalité type feof.
... et ne marche pas en C parce qu'elle ne gère pas les cas d'erreurs
d'E/S,
est à la fin du fichier (elle ne fait que relire l'état précédent).
De plus, fonctionnellement il manque quelque chose au code ci-dessus, il
lit le dernier caractère mais n'en fait rien et sort immédiatement de la
boucle.
Bref, c'est pas du C.
Il est ainsi plus simple de lire un code où la fin de fichier
se détecte via feof() plutot que de tantôt comparer le code de retour à
EOF, à 0, à -1 ou à NULL.
Si c'est pour faire une critique sur le manque d'orthogonalité de la
bibliothèque standard, je ne te contredirais pas, et cela ne s'arrête
pas à stdio d'ailleurs. Clairement la bibliothèque standard du C a été
écrite en marchant, au fur et à mesure des besoins ; l'inconvénient par
rapport à une bibliothèque parfaite inventée d'un coup par un aréopage
c'est le manque d'orthogonalité, l'avantage c'est que l'on est sûr que
cela peut fonctionner ; et avec le langage C tu as choisi ton camp.
Samuel DEVULDER écrivit :
Par ailleurs l'écriture suivante:
char c = (char)fgetc(FLUX);
if(feof(FLUX)) break;
Me semble claire, et assez proche des API des autres langages qui ont
une fonctionnalité type feof.
... et ne marche pas en C parce qu'elle ne gère pas les cas d'erreurs
d'E/S,
est à la fin du fichier (elle ne fait que relire l'état précédent).
De plus, fonctionnellement il manque quelque chose au code ci-dessus, il
lit le dernier caractère mais n'en fait rien et sort immédiatement de la
boucle.
Bref, c'est pas du C.
Il est ainsi plus simple de lire un code où la fin de fichier
se détecte via feof() plutot que de tantôt comparer le code de retour à
EOF, à 0, à -1 ou à NULL.
Si c'est pour faire une critique sur le manque d'orthogonalité de la
bibliothèque standard, je ne te contredirais pas, et cela ne s'arrête
pas à stdio d'ailleurs. Clairement la bibliothèque standard du C a été
écrite en marchant, au fur et à mesure des besoins ; l'inconvénient par
rapport à une bibliothèque parfaite inventée d'un coup par un aréopage
c'est le manque d'orthogonalité, l'avantage c'est que l'on est sûr que
cela peut fonctionner ; et avec le langage C tu as choisi ton camp.
Samuel DEVULDER écrivit :Par ailleurs l'écriture suivante:
char c = (char)fgetc(FLUX);
if(feof(FLUX)) break;
Me semble claire, et assez proche des API des autres langages qui ont
une fonctionnalité type feof.
... et ne marche pas en C parce qu'elle ne gère pas les cas d'erreurs
d'E/S,
est à la fin du fichier (elle ne fait que relire l'état précédent).
De plus, fonctionnellement il manque quelque chose au code ci-dessus, il
lit le dernier caractère mais n'en fait rien et sort immédiatement de la
boucle.
Bref, c'est pas du C.
Il est ainsi plus simple de lire un code où la fin de fichier
se détecte via feof() plutot que de tantôt comparer le code de retour à
EOF, à 0, à -1 ou à NULL.
Si c'est pour faire une critique sur le manque d'orthogonalité de la
bibliothèque standard, je ne te contredirais pas, et cela ne s'arrête
pas à stdio d'ailleurs. Clairement la bibliothèque standard du C a été
écrite en marchant, au fur et à mesure des besoins ; l'inconvénient par
rapport à une bibliothèque parfaite inventée d'un coup par un aréopage
c'est le manque d'orthogonalité, l'avantage c'est que l'on est sûr que
cela peut fonctionner ; et avec le langage C tu as choisi ton camp.
Antoine Leca a écrit :Samuel DEVULDER écrivit :Par ailleurs l'écriture suivante:
char c = (char)fgetc(FLUX);
if(feof(FLUX)) break;
Me semble claire, et assez proche des API des autres langages qui ont
une fonctionnalité type feof.
... et ne marche pas en C parce qu'elle ne gère pas les cas d'erreurs
d'E/S,
Pour cela il y a ferror(). On a 2 concepts distincts: fin de fichier et
erreur de lecture. Donc 2 fonctions. Je trouve cela pas mal.
Parce qu'à l'inverse quand on retourne EOF *aussi* en cas d'erreur,
c'est sacrément ambigu et pas tellement mieux. Bon c'est peut être le
symbole "EOF" qui est mal choisi. "ERR" aurait été plus rationnel:
L'idéal c'est que chacun fasse comme il le souhaite avec ses propre
critères. Mon propos était de rappeler que feof() existe et qu'il a
l'avantage de l'homogénéité face à tester EOF pour fgetc(), NULL pour
fgets(), "<0" pour fread(), tant de complications inutiles qui peuvent
perturber les débutants.
Antoine Leca a écrit :
Samuel DEVULDER écrivit :
Par ailleurs l'écriture suivante:
char c = (char)fgetc(FLUX);
if(feof(FLUX)) break;
Me semble claire, et assez proche des API des autres langages qui ont
une fonctionnalité type feof.
... et ne marche pas en C parce qu'elle ne gère pas les cas d'erreurs
d'E/S,
Pour cela il y a ferror(). On a 2 concepts distincts: fin de fichier et
erreur de lecture. Donc 2 fonctions. Je trouve cela pas mal.
Parce qu'à l'inverse quand on retourne EOF *aussi* en cas d'erreur,
c'est sacrément ambigu et pas tellement mieux. Bon c'est peut être le
symbole "EOF" qui est mal choisi. "ERR" aurait été plus rationnel:
L'idéal c'est que chacun fasse comme il le souhaite avec ses propre
critères. Mon propos était de rappeler que feof() existe et qu'il a
l'avantage de l'homogénéité face à tester EOF pour fgetc(), NULL pour
fgets(), "<0" pour fread(), tant de complications inutiles qui peuvent
perturber les débutants.
Antoine Leca a écrit :Samuel DEVULDER écrivit :Par ailleurs l'écriture suivante:
char c = (char)fgetc(FLUX);
if(feof(FLUX)) break;
Me semble claire, et assez proche des API des autres langages qui ont
une fonctionnalité type feof.
... et ne marche pas en C parce qu'elle ne gère pas les cas d'erreurs
d'E/S,
Pour cela il y a ferror(). On a 2 concepts distincts: fin de fichier et
erreur de lecture. Donc 2 fonctions. Je trouve cela pas mal.
Parce qu'à l'inverse quand on retourne EOF *aussi* en cas d'erreur,
c'est sacrément ambigu et pas tellement mieux. Bon c'est peut être le
symbole "EOF" qui est mal choisi. "ERR" aurait été plus rationnel:
L'idéal c'est que chacun fasse comme il le souhaite avec ses propre
critères. Mon propos était de rappeler que feof() existe et qu'il a
l'avantage de l'homogénéité face à tester EOF pour fgetc(), NULL pour
fgets(), "<0" pour fread(), tant de complications inutiles qui peuvent
perturber les débutants.
Antoine Leca a écrit :
> Samuel DEVULDER écrivit :
>> Par ailleurs l'écriture suivante:
>>
>> char c = (char)fgetc(FLUX);
>> if(feof(FLUX)) break;
>>
>> Me semble claire, et assez proche des API des autres langages qui ont
>> une fonctionnalité type feof.
> ... et ne marche pas en C parce qu'elle ne gère pas les cas d'erreurs
> d'E/S,
Pour cela il y a ferror(). On a 2 concepts distincts: fin de fichier et
erreur de lecture. Donc 2 fonctions. Je trouve cela pas mal.
Parce qu'à l'inverse quand on retourne EOF *aussi* en cas d'erreur, c'est
sacrément ambigu et pas tellement mieux. Bon c'est peut être le symbole
"EOF" qui est mal choisi.
Le seul soucis du code avec feof()/ferror() dans la boucle c'est une perte
de compacité du code (au profit d'une meilleure lisibilité) et (très)
légère perte de perf.. mais bon, face aux vitesse d'I/O c'est parfaitement
insignifiant.
L'idéal c'est que chacun fasse comme il le souhaite avec ses propre
critères. Mon propos était de rappeler que feof() existe et qu'il a
l'avantage de l'homogénéité face à tester EOF pour fgetc(), NULL pour
fgets(), "<0" pour fread(), tant de complications inutiles qui peuvent
perturber les débutants.
Antoine Leca a écrit :
> Samuel DEVULDER écrivit :
>> Par ailleurs l'écriture suivante:
>>
>> char c = (char)fgetc(FLUX);
>> if(feof(FLUX)) break;
>>
>> Me semble claire, et assez proche des API des autres langages qui ont
>> une fonctionnalité type feof.
> ... et ne marche pas en C parce qu'elle ne gère pas les cas d'erreurs
> d'E/S,
Pour cela il y a ferror(). On a 2 concepts distincts: fin de fichier et
erreur de lecture. Donc 2 fonctions. Je trouve cela pas mal.
Parce qu'à l'inverse quand on retourne EOF *aussi* en cas d'erreur, c'est
sacrément ambigu et pas tellement mieux. Bon c'est peut être le symbole
"EOF" qui est mal choisi.
Le seul soucis du code avec feof()/ferror() dans la boucle c'est une perte
de compacité du code (au profit d'une meilleure lisibilité) et (très)
légère perte de perf.. mais bon, face aux vitesse d'I/O c'est parfaitement
insignifiant.
L'idéal c'est que chacun fasse comme il le souhaite avec ses propre
critères. Mon propos était de rappeler que feof() existe et qu'il a
l'avantage de l'homogénéité face à tester EOF pour fgetc(), NULL pour
fgets(), "<0" pour fread(), tant de complications inutiles qui peuvent
perturber les débutants.
Antoine Leca a écrit :
> Samuel DEVULDER écrivit :
>> Par ailleurs l'écriture suivante:
>>
>> char c = (char)fgetc(FLUX);
>> if(feof(FLUX)) break;
>>
>> Me semble claire, et assez proche des API des autres langages qui ont
>> une fonctionnalité type feof.
> ... et ne marche pas en C parce qu'elle ne gère pas les cas d'erreurs
> d'E/S,
Pour cela il y a ferror(). On a 2 concepts distincts: fin de fichier et
erreur de lecture. Donc 2 fonctions. Je trouve cela pas mal.
Parce qu'à l'inverse quand on retourne EOF *aussi* en cas d'erreur, c'est
sacrément ambigu et pas tellement mieux. Bon c'est peut être le symbole
"EOF" qui est mal choisi.
Le seul soucis du code avec feof()/ferror() dans la boucle c'est une perte
de compacité du code (au profit d'une meilleure lisibilité) et (très)
légère perte de perf.. mais bon, face aux vitesse d'I/O c'est parfaitement
insignifiant.
L'idéal c'est que chacun fasse comme il le souhaite avec ses propre
critères. Mon propos était de rappeler que feof() existe et qu'il a
l'avantage de l'homogénéité face à tester EOF pour fgetc(), NULL pour
fgets(), "<0" pour fread(), tant de complications inutiles qui peuvent
perturber les débutants.
Samuel DEVULDER writes:Antoine Leca a écrit :Samuel DEVULDER écrivit :Par ailleurs l'écriture suivante:
char c = (char)fgetc(FLUX);
if(feof(FLUX)) break;
Me semble claire, et assez proche des API des autres langages qui ont
une fonctionnalité type feof.
... et ne marche pas en C parce qu'elle ne gère pas les cas d'erreurs
d'E/S,
Pour cela il y a ferror(). On a 2 concepts distincts: fin de fichier et
erreur de lecture. Donc 2 fonctions. Je trouve cela pas mal.
Mais utiliser ferror et feof n'a du sens qu'apres avoir constate qu'une
lecture a echoue.
Parce qu'à l'inverse quand on retourne EOF *aussi* en cas d'erreur, c'est
sacrément ambigu et pas tellement mieux. Bon c'est peut être le symbole
"EOF" qui est mal choisi.
La on est d'accord.Le seul soucis du code avec feof()/ferror() dans la boucle c'est une perte
de compacité du code (au profit d'une meilleure lisibilité) et (très)
légère perte de perf.. mais bon, face aux vitesse d'I/O c'est parfaitement
insignifiant.
Non, c'est qu'il est incorrect au moins avec scanf, fread et fgets (et si
j'ai bonne memoire c'est formellement le cas aussi avec fgetc mais je n'en
suis pas sur et je ne connais pas d'implementation qui utilise cette
latitude).
#include <stdio.h>
int main()
{
char buf[1024];
while (scanf("%sn", buf) == 1) {
if (feof(stdin)) {
printf("Scanf succeeded and feof is truen");
}
printf("Got %sn", buf);
}
if (ferror(stdin)) {
printf("Errorn");
} else if (feof(stdin)) {
printf("End of filen");
} else {
printf("Why?n");
}
return 0;
}
$ cat data
toto
titi
tutu
$ cat data | ./a.out
Got toto
Got titi
Scanf succeeded and feof is true
Got tutu
End of file
et c'est meme pas un fichier qui n'est pas termine par un 'n'.
L'idéal c'est que chacun fasse comme il le souhaite avec ses propre
critères. Mon propos était de rappeler que feof() existe et qu'il a
l'avantage de l'homogénéité face à tester EOF pour fgetc(), NULL pour
fgets(), "<0" pour fread(), tant de complications inutiles qui peuvent
perturber les débutants.
Non. cf supra. (Avec fread il faut comparer la valeur retournee avec la
taille du buffer, si elles sont differentes, il y a fin de fichier ou
erreur de lecture; c'est avec read(2) sous Unix qu'on peut avoir des
lectures partielles)
Samuel DEVULDER <samuel-dot-devulder@laposte-dot-com> writes:
Antoine Leca a écrit :
Samuel DEVULDER écrivit :
Par ailleurs l'écriture suivante:
char c = (char)fgetc(FLUX);
if(feof(FLUX)) break;
Me semble claire, et assez proche des API des autres langages qui ont
une fonctionnalité type feof.
... et ne marche pas en C parce qu'elle ne gère pas les cas d'erreurs
d'E/S,
Pour cela il y a ferror(). On a 2 concepts distincts: fin de fichier et
erreur de lecture. Donc 2 fonctions. Je trouve cela pas mal.
Mais utiliser ferror et feof n'a du sens qu'apres avoir constate qu'une
lecture a echoue.
Parce qu'à l'inverse quand on retourne EOF *aussi* en cas d'erreur, c'est
sacrément ambigu et pas tellement mieux. Bon c'est peut être le symbole
"EOF" qui est mal choisi.
La on est d'accord.
Le seul soucis du code avec feof()/ferror() dans la boucle c'est une perte
de compacité du code (au profit d'une meilleure lisibilité) et (très)
légère perte de perf.. mais bon, face aux vitesse d'I/O c'est parfaitement
insignifiant.
Non, c'est qu'il est incorrect au moins avec scanf, fread et fgets (et si
j'ai bonne memoire c'est formellement le cas aussi avec fgetc mais je n'en
suis pas sur et je ne connais pas d'implementation qui utilise cette
latitude).
#include <stdio.h>
int main()
{
char buf[1024];
while (scanf("%sn", buf) == 1) {
if (feof(stdin)) {
printf("Scanf succeeded and feof is truen");
}
printf("Got %sn", buf);
}
if (ferror(stdin)) {
printf("Errorn");
} else if (feof(stdin)) {
printf("End of filen");
} else {
printf("Why?n");
}
return 0;
}
$ cat data
toto
titi
tutu
$ cat data | ./a.out
Got toto
Got titi
Scanf succeeded and feof is true
Got tutu
End of file
et c'est meme pas un fichier qui n'est pas termine par un 'n'.
L'idéal c'est que chacun fasse comme il le souhaite avec ses propre
critères. Mon propos était de rappeler que feof() existe et qu'il a
l'avantage de l'homogénéité face à tester EOF pour fgetc(), NULL pour
fgets(), "<0" pour fread(), tant de complications inutiles qui peuvent
perturber les débutants.
Non. cf supra. (Avec fread il faut comparer la valeur retournee avec la
taille du buffer, si elles sont differentes, il y a fin de fichier ou
erreur de lecture; c'est avec read(2) sous Unix qu'on peut avoir des
lectures partielles)
Samuel DEVULDER writes:Antoine Leca a écrit :Samuel DEVULDER écrivit :Par ailleurs l'écriture suivante:
char c = (char)fgetc(FLUX);
if(feof(FLUX)) break;
Me semble claire, et assez proche des API des autres langages qui ont
une fonctionnalité type feof.
... et ne marche pas en C parce qu'elle ne gère pas les cas d'erreurs
d'E/S,
Pour cela il y a ferror(). On a 2 concepts distincts: fin de fichier et
erreur de lecture. Donc 2 fonctions. Je trouve cela pas mal.
Mais utiliser ferror et feof n'a du sens qu'apres avoir constate qu'une
lecture a echoue.
Parce qu'à l'inverse quand on retourne EOF *aussi* en cas d'erreur, c'est
sacrément ambigu et pas tellement mieux. Bon c'est peut être le symbole
"EOF" qui est mal choisi.
La on est d'accord.Le seul soucis du code avec feof()/ferror() dans la boucle c'est une perte
de compacité du code (au profit d'une meilleure lisibilité) et (très)
légère perte de perf.. mais bon, face aux vitesse d'I/O c'est parfaitement
insignifiant.
Non, c'est qu'il est incorrect au moins avec scanf, fread et fgets (et si
j'ai bonne memoire c'est formellement le cas aussi avec fgetc mais je n'en
suis pas sur et je ne connais pas d'implementation qui utilise cette
latitude).
#include <stdio.h>
int main()
{
char buf[1024];
while (scanf("%sn", buf) == 1) {
if (feof(stdin)) {
printf("Scanf succeeded and feof is truen");
}
printf("Got %sn", buf);
}
if (ferror(stdin)) {
printf("Errorn");
} else if (feof(stdin)) {
printf("End of filen");
} else {
printf("Why?n");
}
return 0;
}
$ cat data
toto
titi
tutu
$ cat data | ./a.out
Got toto
Got titi
Scanf succeeded and feof is true
Got tutu
End of file
et c'est meme pas un fichier qui n'est pas termine par un 'n'.
L'idéal c'est que chacun fasse comme il le souhaite avec ses propre
critères. Mon propos était de rappeler que feof() existe et qu'il a
l'avantage de l'homogénéité face à tester EOF pour fgetc(), NULL pour
fgets(), "<0" pour fread(), tant de complications inutiles qui peuvent
perturber les débutants.
Non. cf supra. (Avec fread il faut comparer la valeur retournee avec la
taille du buffer, si elles sont differentes, il y a fin de fichier ou
erreur de lecture; c'est avec read(2) sous Unix qu'on peut avoir des
lectures partielles)
Ah? Mon man n'indique rien de tel.
FEOF(3) NEWLIB
NAME
4.7 `feof'--test for end of file
SYNOPSIS
#include <stdio.h>
int feof(FILE *FP);
DESCRIPTION
`feof' tests whether or not the end of the file identified by
FP has been reached.
RETURNS
`feof' returns `0' if the end of file has not yet been reached;
if at end of file, the result is nonzero.
Il n'est aucunement fait mention qu'il faut *necessairement* avoir
constaté qu'une lecture a échouée. A priori feof() est exploitable quand
on veut et signale si oui ou non on a franchi la fin de fichier. En fait
c'est vraiment lui qui fait foi.
Ah? Mon man n'indique rien de tel.
FEOF(3) NEWLIB
NAME
4.7 `feof'--test for end of file
SYNOPSIS
#include <stdio.h>
int feof(FILE *FP);
DESCRIPTION
`feof' tests whether or not the end of the file identified by
FP has been reached.
RETURNS
`feof' returns `0' if the end of file has not yet been reached;
if at end of file, the result is nonzero.
Il n'est aucunement fait mention qu'il faut *necessairement* avoir
constaté qu'une lecture a échouée. A priori feof() est exploitable quand
on veut et signale si oui ou non on a franchi la fin de fichier. En fait
c'est vraiment lui qui fait foi.
Ah? Mon man n'indique rien de tel.
FEOF(3) NEWLIB
NAME
4.7 `feof'--test for end of file
SYNOPSIS
#include <stdio.h>
int feof(FILE *FP);
DESCRIPTION
`feof' tests whether or not the end of the file identified by
FP has been reached.
RETURNS
`feof' returns `0' if the end of file has not yet been reached;
if at end of file, the result is nonzero.
Il n'est aucunement fait mention qu'il faut *necessairement* avoir
constaté qu'une lecture a échouée. A priori feof() est exploitable quand
on veut et signale si oui ou non on a franchi la fin de fichier. En fait
c'est vraiment lui qui fait foi.
Jean-Marc Bourguet a écrit :
> Samuel DEVULDER writes:
>
>> Antoine Leca a écrit :
>>> Samuel DEVULDER écrivit :
>>>> Par ailleurs l'écriture suivante:
>>>>
>>>> char c = (char)fgetc(FLUX);
>>>> if(feof(FLUX)) break;
>>>>
>>>> Me semble claire, et assez proche des API des autres langages qui ont
>>>> une fonctionnalité type feof.
>>> ... et ne marche pas en C parce qu'elle ne gère pas les cas d'erreurs
>>> d'E/S,
>> Pour cela il y a ferror(). On a 2 concepts distincts: fin de fichier et
>> erreur de lecture. Donc 2 fonctions. Je trouve cela pas mal.
> Mais utiliser ferror et feof n'a du sens qu'apres avoir constate qu'une
> lecture a echoue.
Ah? Mon man n'indique rien de tel.
FEOF(3) NEWLIB
NAME
4.7 `feof'--test for end of file
SYNOPSIS
#include <stdio.h>
int feof(FILE *FP);
DESCRIPTION
`feof' tests whether or not the end of the file identified by
FP has been reached.
Il n'est aucunement fait mention qu'il faut *necessairement* avoir constaté
qu'une lecture a échouée. A priori feof() est exploitable quand on veut et
signale si oui ou non on a franchi la fin de fichier. En fait c'est
vraiment lui qui fait foi.
je vois le trouble sauf que c'est pas tellement feof() qui est incohérent
avec fscanf() mais plutôt l'inverse,
Jean-Marc Bourguet a écrit :
> Samuel DEVULDER <samuel-dot-devulder@laposte-dot-com> writes:
>
>> Antoine Leca a écrit :
>>> Samuel DEVULDER écrivit :
>>>> Par ailleurs l'écriture suivante:
>>>>
>>>> char c = (char)fgetc(FLUX);
>>>> if(feof(FLUX)) break;
>>>>
>>>> Me semble claire, et assez proche des API des autres langages qui ont
>>>> une fonctionnalité type feof.
>>> ... et ne marche pas en C parce qu'elle ne gère pas les cas d'erreurs
>>> d'E/S,
>> Pour cela il y a ferror(). On a 2 concepts distincts: fin de fichier et
>> erreur de lecture. Donc 2 fonctions. Je trouve cela pas mal.
> Mais utiliser ferror et feof n'a du sens qu'apres avoir constate qu'une
> lecture a echoue.
Ah? Mon man n'indique rien de tel.
FEOF(3) NEWLIB
NAME
4.7 `feof'--test for end of file
SYNOPSIS
#include <stdio.h>
int feof(FILE *FP);
DESCRIPTION
`feof' tests whether or not the end of the file identified by
FP has been reached.
Il n'est aucunement fait mention qu'il faut *necessairement* avoir constaté
qu'une lecture a échouée. A priori feof() est exploitable quand on veut et
signale si oui ou non on a franchi la fin de fichier. En fait c'est
vraiment lui qui fait foi.
je vois le trouble sauf que c'est pas tellement feof() qui est incohérent
avec fscanf() mais plutôt l'inverse,
Jean-Marc Bourguet a écrit :
> Samuel DEVULDER writes:
>
>> Antoine Leca a écrit :
>>> Samuel DEVULDER écrivit :
>>>> Par ailleurs l'écriture suivante:
>>>>
>>>> char c = (char)fgetc(FLUX);
>>>> if(feof(FLUX)) break;
>>>>
>>>> Me semble claire, et assez proche des API des autres langages qui ont
>>>> une fonctionnalité type feof.
>>> ... et ne marche pas en C parce qu'elle ne gère pas les cas d'erreurs
>>> d'E/S,
>> Pour cela il y a ferror(). On a 2 concepts distincts: fin de fichier et
>> erreur de lecture. Donc 2 fonctions. Je trouve cela pas mal.
> Mais utiliser ferror et feof n'a du sens qu'apres avoir constate qu'une
> lecture a echoue.
Ah? Mon man n'indique rien de tel.
FEOF(3) NEWLIB
NAME
4.7 `feof'--test for end of file
SYNOPSIS
#include <stdio.h>
int feof(FILE *FP);
DESCRIPTION
`feof' tests whether or not the end of the file identified by
FP has been reached.
Il n'est aucunement fait mention qu'il faut *necessairement* avoir constaté
qu'une lecture a échouée. A priori feof() est exploitable quand on veut et
signale si oui ou non on a franchi la fin de fichier. En fait c'est
vraiment lui qui fait foi.
je vois le trouble sauf que c'est pas tellement feof() qui est incohérent
avec fscanf() mais plutôt l'inverse,
Je ne comprends pas bien.
Je ne comprends pas bien. Tu aurait voulu quoi au juste?
Qu'en fin de fichier scanf() retourne un buffer non rempli? C'est
justement le cas si tu lis passé le feof()==true.
J'ai un peu le sentiment que l'erreur, ou le hiatus, est de considérer
que scanf() retourne un truc en relation directe avec la fin de fichier.
Jean-Marc Bourguet a écrit :(Avec fread il faut comparer la valeur retournee avec la
taille du buffer, si elles sont differentes, il y a fin de fichier ou
erreur de lecture; c'est avec read(2) sous Unix qu'on peut avoir des
lectures partielles)
Je ne comprends pas bien.
Je ne comprends pas bien. Tu aurait voulu quoi au juste?
Qu'en fin de fichier scanf() retourne un buffer non rempli? C'est
justement le cas si tu lis passé le feof()==true.
J'ai un peu le sentiment que l'erreur, ou le hiatus, est de considérer
que scanf() retourne un truc en relation directe avec la fin de fichier.
Jean-Marc Bourguet a écrit :
(Avec fread il faut comparer la valeur retournee avec la
taille du buffer, si elles sont differentes, il y a fin de fichier ou
erreur de lecture; c'est avec read(2) sous Unix qu'on peut avoir des
lectures partielles)
Je ne comprends pas bien.
Je ne comprends pas bien. Tu aurait voulu quoi au juste?
Qu'en fin de fichier scanf() retourne un buffer non rempli? C'est
justement le cas si tu lis passé le feof()==true.
J'ai un peu le sentiment que l'erreur, ou le hiatus, est de considérer
que scanf() retourne un truc en relation directe avec la fin de fichier.
Jean-Marc Bourguet a écrit :(Avec fread il faut comparer la valeur retournee avec la
taille du buffer, si elles sont differentes, il y a fin de fichier ou
erreur de lecture; c'est avec read(2) sous Unix qu'on peut avoir des
lectures partielles)
DESCRIPTION
`feof' tests whether or not the end of the file identified by
FP has been reached.
Il manque la description complete de ce que signifie "the end of the file
has been reached". La norme est plus claire, ca retourne la valeur d'un
indicateur persistant.
Il n'est aucunement fait mention qu'il faut *necessairement* avoir constaté
qu'une lecture a échouée. A priori feof() est exploitable quand on veut et
signale si oui ou non on a franchi la fin de fichier. En fait c'est
vraiment lui qui fait foi.
Oui, il a une definition. Quant a etre exploitable, c'est le point que je
conteste.
Quand feof retourne vrai, tu es sur que l'entree qui suit va echouer.
moins si ton implementation suit C99 sur ce point, C90 n'etait pas clair et
au moins certaines implementations n'ont pas ce comportement (Linux,
Solaris et AIX ne l'ont pas dans les versions installees ici quand l'entree
est un terminal). Quand il retourne faux, tu ne peux rien predire.
Donc en pratique, le seul moyen d'utiliser feof, c'est apres une entree qui
a echoue pour determiner pourquoi.
servir pour contourner les problemes causes par la non conformite a C99 de
certaines implementations et le tester avant une entree.
A lire la suite, je crois qu'on a fini par se comprendre.
je dis que la structure a utiliser pour lire, c'est
while (io succeed) {
...
}
if (ferror()) {
// IO error
} else if (feof()) {
// End of file
} else {
// format error (scanf only)
}
(en passant, on voit un cas ou feof est a utiliser, il permet de discerner
une fin de fichier et un probleme de formatage -- j'ai tendance a ne pas
utiliser fscanf et a oublier ses particularites -- mais attention, apres un
probleme de formatage on peut avoir feof a vrai aussi) et les autres
structures, en particulier celles qui utilisent feof pour controler la
boucle comme
for (;;) {
scanf/getc/gets/fread
if (feof()) break;
...
}
ou
while (!feof()) {
scanf/getc/gets/fread
...
}
au mieux ne sont pas idiomatiques (peut-etre le premier cas avec fgetc mais
je n'en suis pas sur), au pire sont problematiques (le deuxieme cas
toujours, le premier cas avec fread, fscanf suivant la chaine de format,
fgets et les fichiers non termine par 'n', ...)je vois le trouble sauf que c'est pas tellement feof() qui est incohérent
avec fscanf() mais plutôt l'inverse,
Je ne vois pas d'incoherence, simplement que la maniere d'utiliser feof est
pour classifier une situation connue, pas la detecter.
parallele avec errno est valide.
DESCRIPTION
`feof' tests whether or not the end of the file identified by
FP has been reached.
Il manque la description complete de ce que signifie "the end of the file
has been reached". La norme est plus claire, ca retourne la valeur d'un
indicateur persistant.
Il n'est aucunement fait mention qu'il faut *necessairement* avoir constaté
qu'une lecture a échouée. A priori feof() est exploitable quand on veut et
signale si oui ou non on a franchi la fin de fichier. En fait c'est
vraiment lui qui fait foi.
Oui, il a une definition. Quant a etre exploitable, c'est le point que je
conteste.
Quand feof retourne vrai, tu es sur que l'entree qui suit va echouer.
moins si ton implementation suit C99 sur ce point, C90 n'etait pas clair et
au moins certaines implementations n'ont pas ce comportement (Linux,
Solaris et AIX ne l'ont pas dans les versions installees ici quand l'entree
est un terminal). Quand il retourne faux, tu ne peux rien predire.
Donc en pratique, le seul moyen d'utiliser feof, c'est apres une entree qui
a echoue pour determiner pourquoi.
servir pour contourner les problemes causes par la non conformite a C99 de
certaines implementations et le tester avant une entree.
A lire la suite, je crois qu'on a fini par se comprendre.
je dis que la structure a utiliser pour lire, c'est
while (io succeed) {
...
}
if (ferror()) {
// IO error
} else if (feof()) {
// End of file
} else {
// format error (scanf only)
}
(en passant, on voit un cas ou feof est a utiliser, il permet de discerner
une fin de fichier et un probleme de formatage -- j'ai tendance a ne pas
utiliser fscanf et a oublier ses particularites -- mais attention, apres un
probleme de formatage on peut avoir feof a vrai aussi) et les autres
structures, en particulier celles qui utilisent feof pour controler la
boucle comme
for (;;) {
scanf/getc/gets/fread
if (feof()) break;
...
}
ou
while (!feof()) {
scanf/getc/gets/fread
...
}
au mieux ne sont pas idiomatiques (peut-etre le premier cas avec fgetc mais
je n'en suis pas sur), au pire sont problematiques (le deuxieme cas
toujours, le premier cas avec fread, fscanf suivant la chaine de format,
fgets et les fichiers non termine par 'n', ...)
je vois le trouble sauf que c'est pas tellement feof() qui est incohérent
avec fscanf() mais plutôt l'inverse,
Je ne vois pas d'incoherence, simplement que la maniere d'utiliser feof est
pour classifier une situation connue, pas la detecter.
parallele avec errno est valide.
DESCRIPTION
`feof' tests whether or not the end of the file identified by
FP has been reached.
Il manque la description complete de ce que signifie "the end of the file
has been reached". La norme est plus claire, ca retourne la valeur d'un
indicateur persistant.
Il n'est aucunement fait mention qu'il faut *necessairement* avoir constaté
qu'une lecture a échouée. A priori feof() est exploitable quand on veut et
signale si oui ou non on a franchi la fin de fichier. En fait c'est
vraiment lui qui fait foi.
Oui, il a une definition. Quant a etre exploitable, c'est le point que je
conteste.
Quand feof retourne vrai, tu es sur que l'entree qui suit va echouer.
moins si ton implementation suit C99 sur ce point, C90 n'etait pas clair et
au moins certaines implementations n'ont pas ce comportement (Linux,
Solaris et AIX ne l'ont pas dans les versions installees ici quand l'entree
est un terminal). Quand il retourne faux, tu ne peux rien predire.
Donc en pratique, le seul moyen d'utiliser feof, c'est apres une entree qui
a echoue pour determiner pourquoi.
servir pour contourner les problemes causes par la non conformite a C99 de
certaines implementations et le tester avant une entree.
A lire la suite, je crois qu'on a fini par se comprendre.
je dis que la structure a utiliser pour lire, c'est
while (io succeed) {
...
}
if (ferror()) {
// IO error
} else if (feof()) {
// End of file
} else {
// format error (scanf only)
}
(en passant, on voit un cas ou feof est a utiliser, il permet de discerner
une fin de fichier et un probleme de formatage -- j'ai tendance a ne pas
utiliser fscanf et a oublier ses particularites -- mais attention, apres un
probleme de formatage on peut avoir feof a vrai aussi) et les autres
structures, en particulier celles qui utilisent feof pour controler la
boucle comme
for (;;) {
scanf/getc/gets/fread
if (feof()) break;
...
}
ou
while (!feof()) {
scanf/getc/gets/fread
...
}
au mieux ne sont pas idiomatiques (peut-etre le premier cas avec fgetc mais
je n'en suis pas sur), au pire sont problematiques (le deuxieme cas
toujours, le premier cas avec fread, fscanf suivant la chaine de format,
fgets et les fichiers non termine par 'n', ...)je vois le trouble sauf que c'est pas tellement feof() qui est incohérent
avec fscanf() mais plutôt l'inverse,
Je ne vois pas d'incoherence, simplement que la maniere d'utiliser feof est
pour classifier une situation connue, pas la detecter.
parallele avec errno est valide.
Question con: est si on fait un fseek(), ca reset le eof?
Et si on fait un ungetc() ?
J'imagine que la norme explique ces cas là qui sont plus rares.
Question con: est si on fait un fseek(), ca reset le eof?
Et si on fait un ungetc() ?
J'imagine que la norme explique ces cas là qui sont plus rares.
Question con: est si on fait un fseek(), ca reset le eof?
Et si on fait un ungetc() ?
J'imagine que la norme explique ces cas là qui sont plus rares.