Y a-t-il un grand gourou qui pourra me dire pourquoi il faut toujours lire
un caractère avant
que feof renvoie vrai si le fichier est vide où si l'on a atteint la fi n du
fichier ?
#include <stdio.h>
int main() {
FILE * fdesc;
char c;
if ( !(fdesc= fopen("toto.txt", "r")) ) {
perror("ouverture de "toto.txt"n");
exit(-1);
}
c= fgetc(fdesc); // pourquoi cette ligne là ? (lire plus bas)
if ( feof(fdesc) ) printf("toto vide");
return 0;
}
On créer un fichier vide toto.txt par la commande
$cat >toto.txt
Ctrl-D
Dissertation : je suis d'accord pour dire que mécaniquement on ne peut pas
savoir si l'on a atteint la fin de fichier avant d'avoir "accéder" au
fichier. Mais, alors, pourquoi permettre d'utiliser la fonction feof() av ant
d'avoir "accéder" au fichier (i.e. d'utiliser getc()) ? Juste Non ?
C++ ne résoud pas le problème...
Et Java ?
Pouvez-vous me répondre en me donnant un bout de code Java.
Thanks ;-)
P.S. : en gros ça marche seulement parce qu'un gars à
programmer feof() comme cela !
Y a-t-il un grand gourou qui pourra me dire pourquoi il faut toujours lire
un caractère avant
que feof renvoie vrai si le fichier est vide où si l'on a atteint la fi n du
fichier ?
#include <stdio.h>
int main() {
FILE * fdesc;
char c;
if ( !(fdesc= fopen("toto.txt", "r")) ) {
perror("ouverture de "toto.txt"n");
exit(-1);
}
c= fgetc(fdesc); // pourquoi cette ligne là ? (lire plus bas)
if ( feof(fdesc) ) printf("toto vide");
return 0;
}
On créer un fichier vide toto.txt par la commande
$cat >toto.txt
Ctrl-D
Dissertation : je suis d'accord pour dire que mécaniquement on ne peut pas
savoir si l'on a atteint la fin de fichier avant d'avoir "accéder" au
fichier. Mais, alors, pourquoi permettre d'utiliser la fonction feof() av ant
d'avoir "accéder" au fichier (i.e. d'utiliser getc()) ? Juste Non ?
C++ ne résoud pas le problème...
Et Java ?
Pouvez-vous me répondre en me donnant un bout de code Java.
Thanks ;-)
P.S. : en gros ça marche seulement parce qu'un gars à
programmer feof() comme cela !
Y a-t-il un grand gourou qui pourra me dire pourquoi il faut toujours lire
un caractère avant
que feof renvoie vrai si le fichier est vide où si l'on a atteint la fi n du
fichier ?
#include <stdio.h>
int main() {
FILE * fdesc;
char c;
if ( !(fdesc= fopen("toto.txt", "r")) ) {
perror("ouverture de "toto.txt"n");
exit(-1);
}
c= fgetc(fdesc); // pourquoi cette ligne là ? (lire plus bas)
if ( feof(fdesc) ) printf("toto vide");
return 0;
}
On créer un fichier vide toto.txt par la commande
$cat >toto.txt
Ctrl-D
Dissertation : je suis d'accord pour dire que mécaniquement on ne peut pas
savoir si l'on a atteint la fin de fichier avant d'avoir "accéder" au
fichier. Mais, alors, pourquoi permettre d'utiliser la fonction feof() av ant
d'avoir "accéder" au fichier (i.e. d'utiliser getc()) ? Juste Non ?
C++ ne résoud pas le problème...
Et Java ?
Pouvez-vous me répondre en me donnant un bout de code Java.
Thanks ;-)
P.S. : en gros ça marche seulement parce qu'un gars à
programmer feof() comme cela !
Y a-t-il un grand gourou qui pourra me dire pourquoi il faut toujours lire
un caractère avant
que feof renvoie vrai si le fichier est vide où si l'on a atteint la fin du
fichier ?
Dissertation : je suis d'accord pour dire que mécaniquement on ne peut pas
savoir si l'on a atteint la fin de fichier avant d'avoir "accéder" au
fichier. Mais, alors, pourquoi permettre d'utiliser la fonction feof() avant
d'avoir "accéder" au fichier (i.e. d'utiliser getc()) ? Juste Non ?
P.S. : en gros ça marche seulement parce qu'un gars à programmer feof()
comme cela !
Y a-t-il un grand gourou qui pourra me dire pourquoi il faut toujours lire
un caractère avant
que feof renvoie vrai si le fichier est vide où si l'on a atteint la fin du
fichier ?
Dissertation : je suis d'accord pour dire que mécaniquement on ne peut pas
savoir si l'on a atteint la fin de fichier avant d'avoir "accéder" au
fichier. Mais, alors, pourquoi permettre d'utiliser la fonction feof() avant
d'avoir "accéder" au fichier (i.e. d'utiliser getc()) ? Juste Non ?
P.S. : en gros ça marche seulement parce qu'un gars à programmer feof()
comme cela !
Y a-t-il un grand gourou qui pourra me dire pourquoi il faut toujours lire
un caractère avant
que feof renvoie vrai si le fichier est vide où si l'on a atteint la fin du
fichier ?
Dissertation : je suis d'accord pour dire que mécaniquement on ne peut pas
savoir si l'on a atteint la fin de fichier avant d'avoir "accéder" au
fichier. Mais, alors, pourquoi permettre d'utiliser la fonction feof() avant
d'avoir "accéder" au fichier (i.e. d'utiliser getc()) ? Juste Non ?
P.S. : en gros ça marche seulement parce qu'un gars à programmer feof()
comme cela !
Et Java ?
Les mêmes règles que C et C++, sans doute.
Et Java ?
Les mêmes règles que C et C++, sans doute.
Et Java ?
Les mêmes règles que C et C++, sans doute.
Y a-t-il un grand gourou qui pourra me dire pourquoi il faut toujours l ire
un caractère avant
que feof renvoie vrai si le fichier est vide où si l'on a atteint la fin du
fichier ?
Parce que quelqu'un peut écrire dans le fichier pendant que tu lis...
En fait, en C (car le code que tu postes est surtout du C, d'où mon
cros-post et le fu2), on lit dans un 'flux' qui peut être autre
chose qu'un fichier (cf stdin, stdout, sdterr).
Imagine deux processus en train de communiquer par des flux.
Ce n'est pas parce que le flux est vide à un moment qu'il
le sera plus tard.
Y a-t-il un grand gourou qui pourra me dire pourquoi il faut toujours l ire
un caractère avant
que feof renvoie vrai si le fichier est vide où si l'on a atteint la fin du
fichier ?
Parce que quelqu'un peut écrire dans le fichier pendant que tu lis...
En fait, en C (car le code que tu postes est surtout du C, d'où mon
cros-post et le fu2), on lit dans un 'flux' qui peut être autre
chose qu'un fichier (cf stdin, stdout, sdterr).
Imagine deux processus en train de communiquer par des flux.
Ce n'est pas parce que le flux est vide à un moment qu'il
le sera plus tard.
Y a-t-il un grand gourou qui pourra me dire pourquoi il faut toujours l ire
un caractère avant
que feof renvoie vrai si le fichier est vide où si l'on a atteint la fin du
fichier ?
Parce que quelqu'un peut écrire dans le fichier pendant que tu lis...
En fait, en C (car le code que tu postes est surtout du C, d'où mon
cros-post et le fu2), on lit dans un 'flux' qui peut être autre
chose qu'un fichier (cf stdin, stdout, sdterr).
Imagine deux processus en train de communiquer par des flux.
Ce n'est pas parce que le flux est vide à un moment qu'il
le sera plus tard.
Y a-t-il un grand gourou qui pourra me dire pourquoi il faut toujours
lire
un caractère avant
que feof renvoie vrai si le fichier est vide où si l'on a atteint la fin
du
fichier ?
Parce que quelqu'un peut écrire dans le fichier pendant que tu lis...
En fait, en C (car le code que tu postes est surtout du C, d'où mon
cros-post et le fu2), on lit dans un 'flux' qui peut être autre
chose qu'un fichier (cf stdin, stdout, sdterr).
Imagine deux processus en train de communiquer par des flux.
Ce n'est pas parce que le flux est vide à un moment qu'il
le sera plus tard.
Y a-t-il un grand gourou qui pourra me dire pourquoi il faut toujours
lire
un caractère avant
que feof renvoie vrai si le fichier est vide où si l'on a atteint la fin
du
fichier ?
Parce que quelqu'un peut écrire dans le fichier pendant que tu lis...
En fait, en C (car le code que tu postes est surtout du C, d'où mon
cros-post et le fu2), on lit dans un 'flux' qui peut être autre
chose qu'un fichier (cf stdin, stdout, sdterr).
Imagine deux processus en train de communiquer par des flux.
Ce n'est pas parce que le flux est vide à un moment qu'il
le sera plus tard.
Y a-t-il un grand gourou qui pourra me dire pourquoi il faut toujours
lire
un caractère avant
que feof renvoie vrai si le fichier est vide où si l'on a atteint la fin
du
fichier ?
Parce que quelqu'un peut écrire dans le fichier pendant que tu lis...
En fait, en C (car le code que tu postes est surtout du C, d'où mon
cros-post et le fu2), on lit dans un 'flux' qui peut être autre
chose qu'un fichier (cf stdin, stdout, sdterr).
Imagine deux processus en train de communiquer par des flux.
Ce n'est pas parce que le flux est vide à un moment qu'il
le sera plus tard.
"James Kanze" a écrit dans le message de news:
On Jun 18, 9:41 am, Marc Boyer
wrote:Y a-t-il un grand gourou qui pourra me dire pourquoi il faut toujours
lire
un caractère avant
que feof renvoie vrai si le fichier est vide où si l'on a atteint la fin
du
fichier ?
Parce que quelqu'un peut écrire dans le fichier pendant que tu lis...
En fait, en C (car le code que tu postes est surtout du C, d'où mon
cros-post et le fu2), on lit dans un 'flux' qui peut être autre
chose qu'un fichier (cf stdin, stdout, sdterr).
Imagine deux processus en train de communiquer par des flux.
Ce n'est pas parce que le flux est vide à un moment qu'il
le sera plus tard.
C'est beaucoup plus simple que cela : feof() ne fait que lire l'indicateur
de fin de fichier, comme ferr() lit l'indicateur d'erreur d'un FILE *
Pour utiliser correctement les FILE *, il est vivement recommandé de suivre
les exemples idiomatiques classiques, tels qu'exposés par Kernighan et
Ritchie, et d'oublier toute référence au Pascal et autres Basic qui ont une
autre philosophie.
"James Kanze" <james.kanze@gmail.com> a écrit dans le message de news:
1182236751.947694.52820@w5g2000hsg.googlegroups.com...
On Jun 18, 9:41 am, Marc Boyer <Marc.Bo...@enseeiht.yahoo.fr.invalid>
wrote:
Y a-t-il un grand gourou qui pourra me dire pourquoi il faut toujours
lire
un caractère avant
que feof renvoie vrai si le fichier est vide où si l'on a atteint la fin
du
fichier ?
Parce que quelqu'un peut écrire dans le fichier pendant que tu lis...
En fait, en C (car le code que tu postes est surtout du C, d'où mon
cros-post et le fu2), on lit dans un 'flux' qui peut être autre
chose qu'un fichier (cf stdin, stdout, sdterr).
Imagine deux processus en train de communiquer par des flux.
Ce n'est pas parce que le flux est vide à un moment qu'il
le sera plus tard.
C'est beaucoup plus simple que cela : feof() ne fait que lire l'indicateur
de fin de fichier, comme ferr() lit l'indicateur d'erreur d'un FILE *
Pour utiliser correctement les FILE *, il est vivement recommandé de suivre
les exemples idiomatiques classiques, tels qu'exposés par Kernighan et
Ritchie, et d'oublier toute référence au Pascal et autres Basic qui ont une
autre philosophie.
"James Kanze" a écrit dans le message de news:
On Jun 18, 9:41 am, Marc Boyer
wrote:Y a-t-il un grand gourou qui pourra me dire pourquoi il faut toujours
lire
un caractère avant
que feof renvoie vrai si le fichier est vide où si l'on a atteint la fin
du
fichier ?
Parce que quelqu'un peut écrire dans le fichier pendant que tu lis...
En fait, en C (car le code que tu postes est surtout du C, d'où mon
cros-post et le fu2), on lit dans un 'flux' qui peut être autre
chose qu'un fichier (cf stdin, stdout, sdterr).
Imagine deux processus en train de communiquer par des flux.
Ce n'est pas parce que le flux est vide à un moment qu'il
le sera plus tard.
C'est beaucoup plus simple que cela : feof() ne fait que lire l'indicateur
de fin de fichier, comme ferr() lit l'indicateur d'erreur d'un FILE *
Pour utiliser correctement les FILE *, il est vivement recommandé de suivre
les exemples idiomatiques classiques, tels qu'exposés par Kernighan et
Ritchie, et d'oublier toute référence au Pascal et autres Basic qui ont une
autre philosophie.
"James Kanze" a écrit dans le message de
news:
On Jun 18, 9:41 am, Marc Boyer wrote:Y a-t-il un grand gourou qui pourra me dire pourquoi il faut
toujours lire un caractère avant
que feof renvoie vrai si le fichier est vide où si l'on a atteint
la fin du fichier ?
Parce que quelqu'un peut écrire dans le fichier pendant que tu
lis... En fait, en C (car le code que tu postes est surtout du C,
d'où mon cros-post et le fu2), on lit dans un 'flux' qui peut être
autre chose qu'un fichier (cf stdin, stdout, sdterr).
Imagine deux processus en train de communiquer par des flux.
Ce n'est pas parce que le flux est vide à un moment qu'il
le sera plus tard.
C'est beaucoup plus simple que cela : feof() ne fait que lire
l'indicateur de fin de fichier, comme ferr() lit l'indicateur
d'erreur d'un FILE *
Mais ça, c'est de l'implantation qui correspond à un choix
sémantique.
On aurait pu implanter feof comme
int guess_feof(FILE* f){
int c= getc(f);
int res= c != EOF;
ungetc(c, f);
return res;
}
"James Kanze" <james.kanze@gmail.com> a écrit dans le message de
news: 1182236751.947694.52820@w5g2000hsg.googlegroups.com...
On Jun 18, 9:41 am, Marc Boyer wrote:
Y a-t-il un grand gourou qui pourra me dire pourquoi il faut
toujours lire un caractère avant
que feof renvoie vrai si le fichier est vide où si l'on a atteint
la fin du fichier ?
Parce que quelqu'un peut écrire dans le fichier pendant que tu
lis... En fait, en C (car le code que tu postes est surtout du C,
d'où mon cros-post et le fu2), on lit dans un 'flux' qui peut être
autre chose qu'un fichier (cf stdin, stdout, sdterr).
Imagine deux processus en train de communiquer par des flux.
Ce n'est pas parce que le flux est vide à un moment qu'il
le sera plus tard.
C'est beaucoup plus simple que cela : feof() ne fait que lire
l'indicateur de fin de fichier, comme ferr() lit l'indicateur
d'erreur d'un FILE *
Mais ça, c'est de l'implantation qui correspond à un choix
sémantique.
On aurait pu implanter feof comme
int guess_feof(FILE* f){
int c= getc(f);
int res= c != EOF;
ungetc(c, f);
return res;
}
"James Kanze" a écrit dans le message de
news:
On Jun 18, 9:41 am, Marc Boyer wrote:Y a-t-il un grand gourou qui pourra me dire pourquoi il faut
toujours lire un caractère avant
que feof renvoie vrai si le fichier est vide où si l'on a atteint
la fin du fichier ?
Parce que quelqu'un peut écrire dans le fichier pendant que tu
lis... En fait, en C (car le code que tu postes est surtout du C,
d'où mon cros-post et le fu2), on lit dans un 'flux' qui peut être
autre chose qu'un fichier (cf stdin, stdout, sdterr).
Imagine deux processus en train de communiquer par des flux.
Ce n'est pas parce que le flux est vide à un moment qu'il
le sera plus tard.
C'est beaucoup plus simple que cela : feof() ne fait que lire
l'indicateur de fin de fichier, comme ferr() lit l'indicateur
d'erreur d'un FILE *
Mais ça, c'est de l'implantation qui correspond à un choix
sémantique.
On aurait pu implanter feof comme
int guess_feof(FILE* f){
int c= getc(f);
int res= c != EOF;
ungetc(c, f);
return res;
}
En news:,
Marc Boyer va escriure:
"James Kanze" a écrit dans le message de
news:
On Jun 18, 9:41 am, Marc Boyer wrote:Y a-t-il un grand gourou qui pourra me dire pourquoi il faut
toujours lire un caractère avant
que feof renvoie vrai si le fichier est vide où si l'on a atteint
la fin du fichier ?
Parce que quelqu'un peut écrire dans le fichier pendant que tu
lis... En fait, en C (car le code que tu postes est surtout du C,
d'où mon cros-post et le fu2), on lit dans un 'flux' qui peut être
autre chose qu'un fichier (cf stdin, stdout, sdterr).
Imagine deux processus en train de communiquer par des flux.
Ce n'est pas parce que le flux est vide à un moment qu'il
le sera plus tard.
C'est beaucoup plus simple que cela : feof() ne fait que lire
l'indicateur de fin de fichier, comme ferr() lit l'indicateur
d'erreur d'un FILE *
Mais ça, c'est de l'implantation qui correspond à un choix
sémantique.
Pas sûr d'être d'accord, donc on va essayer de reformuler...
On aurait pu implanter feof comme
int guess_feof(FILE* f){
int c= getc(f);
int res= c != EOF;
ungetc(c, f);
return res;
}
Si tu fais cela sur un flux dynamique (pas un fichier, disons un socket pour
fixer les idées), tu vas faire une lecture (bloquante) juste pour savoir si
le flux est vide... ou alors, il y a quelque part, plus bas, un select()
avec un délai d'attente pour éviter de bloquer...
Bref, ta solution essaye de déterminer l'état _actuel_ du flux, et cela peut
prendre pas mal de temps.
En news:slrnf7hka8.9am.Marc.Boyer@localhost.localdomain,
Marc Boyer va escriure:
"James Kanze" <james.kanze@gmail.com> a écrit dans le message de
news: 1182236751.947694.52820@w5g2000hsg.googlegroups.com...
On Jun 18, 9:41 am, Marc Boyer wrote:
Y a-t-il un grand gourou qui pourra me dire pourquoi il faut
toujours lire un caractère avant
que feof renvoie vrai si le fichier est vide où si l'on a atteint
la fin du fichier ?
Parce que quelqu'un peut écrire dans le fichier pendant que tu
lis... En fait, en C (car le code que tu postes est surtout du C,
d'où mon cros-post et le fu2), on lit dans un 'flux' qui peut être
autre chose qu'un fichier (cf stdin, stdout, sdterr).
Imagine deux processus en train de communiquer par des flux.
Ce n'est pas parce que le flux est vide à un moment qu'il
le sera plus tard.
C'est beaucoup plus simple que cela : feof() ne fait que lire
l'indicateur de fin de fichier, comme ferr() lit l'indicateur
d'erreur d'un FILE *
Mais ça, c'est de l'implantation qui correspond à un choix
sémantique.
Pas sûr d'être d'accord, donc on va essayer de reformuler...
On aurait pu implanter feof comme
int guess_feof(FILE* f){
int c= getc(f);
int res= c != EOF;
ungetc(c, f);
return res;
}
Si tu fais cela sur un flux dynamique (pas un fichier, disons un socket pour
fixer les idées), tu vas faire une lecture (bloquante) juste pour savoir si
le flux est vide... ou alors, il y a quelque part, plus bas, un select()
avec un délai d'attente pour éviter de bloquer...
Bref, ta solution essaye de déterminer l'état _actuel_ du flux, et cela peut
prendre pas mal de temps.
En news:,
Marc Boyer va escriure:
"James Kanze" a écrit dans le message de
news:
On Jun 18, 9:41 am, Marc Boyer wrote:Y a-t-il un grand gourou qui pourra me dire pourquoi il faut
toujours lire un caractère avant
que feof renvoie vrai si le fichier est vide où si l'on a atteint
la fin du fichier ?
Parce que quelqu'un peut écrire dans le fichier pendant que tu
lis... En fait, en C (car le code que tu postes est surtout du C,
d'où mon cros-post et le fu2), on lit dans un 'flux' qui peut être
autre chose qu'un fichier (cf stdin, stdout, sdterr).
Imagine deux processus en train de communiquer par des flux.
Ce n'est pas parce que le flux est vide à un moment qu'il
le sera plus tard.
C'est beaucoup plus simple que cela : feof() ne fait que lire
l'indicateur de fin de fichier, comme ferr() lit l'indicateur
d'erreur d'un FILE *
Mais ça, c'est de l'implantation qui correspond à un choix
sémantique.
Pas sûr d'être d'accord, donc on va essayer de reformuler...
On aurait pu implanter feof comme
int guess_feof(FILE* f){
int c= getc(f);
int res= c != EOF;
ungetc(c, f);
return res;
}
Si tu fais cela sur un flux dynamique (pas un fichier, disons un socket pour
fixer les idées), tu vas faire une lecture (bloquante) juste pour savoir si
le flux est vide... ou alors, il y a quelque part, plus bas, un select()
avec un délai d'attente pour éviter de bloquer...
Bref, ta solution essaye de déterminer l'état _actuel_ du flux, et cela peut
prendre pas mal de temps.
En news:,
Marc Boyer va escriure:Mais ça, c'est de l'implantation qui correspond à un choix
sémantique.
Pas sûr d'être d'accord, donc on va essayer de reformuler...
Je peux reformuler moi même: un choix a été fait, celui
de détecter la fin de flux *après* l'échec d'une lecture.
Je contestais juste la démache de Charlie qui expliquait la
sémantique par un choix d'implantation.
En news:slrnf7hka8.9am.Marc.Boyer@localhost.localdomain,
Marc Boyer va escriure:
Mais ça, c'est de l'implantation qui correspond à un choix
sémantique.
Pas sûr d'être d'accord, donc on va essayer de reformuler...
Je peux reformuler moi même: un choix a été fait, celui
de détecter la fin de flux *après* l'échec d'une lecture.
Je contestais juste la démache de Charlie qui expliquait la
sémantique par un choix d'implantation.
En news:,
Marc Boyer va escriure:Mais ça, c'est de l'implantation qui correspond à un choix
sémantique.
Pas sûr d'être d'accord, donc on va essayer de reformuler...
Je peux reformuler moi même: un choix a été fait, celui
de détecter la fin de flux *après* l'échec d'une lecture.
Je contestais juste la démache de Charlie qui expliquait la
sémantique par un choix d'implantation.