Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

comprendre fgets

94 réponses
Avatar
bpascal123
Bonjour

Avec p2 qui pointe sur une chaine saisie avec fgets (ex."abcd")
dans for ( p2 ; *p2 ; p2++ )
Pourquoi l'incr=E9mentation se fait sur 6 intervalles en m=E9moire.

0 =3D a
1 =3D b
2 =3D c
3 =3D d
4 =3D \0
5 =3D ???

A quoi correspond la derni=E8re position (numero 5) ?

(En fait, je veux dire que je dois d=E9cr=E9menter 2 fois apres la fin
de la boucle for pour pointer p2 sur 'd' en position 3). Ca veut dire
qu'en plus de '\0', fgets inclue un autre caract=E8re.

Question suppl=E9mentaire (culture g=E9n=E9ral en informatique) :
La chaine enregistr=E9e avec fgets se trouve dans la memoire ram ou
dans un des registres?

Merci

10 réponses

Avatar
batyann811
-ed- a écrit :
Ceci-dit, les E/S en Java, c'est pas d'une simplicité biblique non
plus... Quand au Pasca standard, ça n'existe carrément pas !



Que veux tu dire par ça n'existe pas ?
Avatar
Marc Boyer
Le 09-11-2009, Marc Espie a écrit :
In article <hd8pmk$eau$,
(rappel: de toutes facons, on ne peut pas flusher un flux d'entree de
facon portable, donc s'ils veulent des trucs plus funky, va
falloir attendre...)



Qu'appelles-tu "flusher" ? Il me semblait qu'on avait
scanf("%*[^n]%*c")

Marc Boyer
--
En prenant aux 10% des francais les plus riches 12% de leurs revenus,
on pourrait doubler les revenus des 10% les plus pauvres.
http://www.inegalites.fr/spip.php?article1&id_mot0
Avatar
espie
In article <hd8v4o$gho$,
Marc Boyer wrote:
Le 09-11-2009, Marc Espie a écrit :
In article <hd8pmk$eau$,
(rappel: de toutes facons, on ne peut pas flusher un flux d'entree de
facon portable, donc s'ils veulent des trucs plus funky, va
falloir attendre...)



Qu'appelles-tu "flusher" ? Il me semblait qu'on avait
scanf("%*[^n]%*c")




Par rapport a fflush, il manque l'aspect synchro dans le temps.

Lorsque tu fais fflush(stdout), tu t'attends a ce qu'il n'y a plus rien
dans tes tampons, et tout affiche juste apres la ligne en question.

De meme, parfois, tu aimerais bien pouvoir dire "okay, je vire tout ce qui
est en attente sur stdio, la maintenant, parce que je vais interagir
directement avec l'utilisateur, et que ca impose de gicler tout ce qu'il
a entre jusqu'ici".

Manque de bol, il n'y a pas d'equivalent au fflush(stdout) sur un flux
d'entree. Sous Unix, tu peux jouer avec termios, a coup de tcflush, ou
de tcsetattr(...TCSAFLUSH), mais c'est bien evidemment non portable.
Avatar
-ed-
On 8 nov, 15:51, Éric Lévénez wrote:
> Par curiosité, j'aimerai bien savoir comment on fait pour envoyer un
> '' lors d'une saisie (sous UNIX).

Ctrl-@



Ça fout la trouille ...

> Dans tous les cas, avoir un '' en entrée sur un fichier texte est p eu
> vraisemblable.

Pas plus invraisemblable qu'un autre caractère. Les outils GNU utilisen t
très souvent le NUL comme séparateur de nom de fichier. Voir "find" p ar
exemple.



Ce qui n'est pas compatible avec les fonctions C standards de
traitement des chaines... dont fgets() !

Faire entrer un 0 dans un stdin est AMA, un UB ...
Avatar
-ed-
On 9 nov, 12:03, batyann811 wrote:
-ed- a écrit :

> Ceci-dit, les E/S en Java, c'est pas d'une simplicité biblique non
> plus... Quand au Pasca standard, ça n'existe carrément pas !

Que veux tu dire par ça n'existe pas ?



Le Pascal standard ne gère les les flux.
Avatar
-ed-
On 9 nov, 12:54, (Marc Espie) wrote:
De meme, parfois, tu aimerais bien pouvoir dire "okay, je vire tout ce qu i
est en attente sur stdio, la maintenant, parce que je vais interagir
directement avec l'utilisateur, et que ca impose de gicler tout ce qu'il
a entre jusqu'ici".



Cette opération doit etre faite systématiquement et de manière
'intelligente' après chaque appel à une fonction de saisie. C'est
tout. L'ordre à respecter absolument est :

1 - Saisir
2 - Nettoyer

et pas le contraire comme on le voit trop souvent. On ne peut jamais
présumer ce de qui c'est passé avant, on ne sait donc pas comment
vider le flux. Par contre, après une saisie, on sait parfaitement ce
qu'il y a à faire (ça dépend de la fonction, parfois de la valeur
saisie etc.).

Cette méthode est évidemment portable.
Avatar
candide
-ed- a écrit :

Ce qui n'est pas compatible avec les fonctions C standards de
traitement des chaines... dont fgets() !



Si tu commences à confondre stdio.h et string.h ...

fgets ne traite pas de chaîne (=string en C ie char* terminé par 0).




Faire entrer un 0 dans un stdin est AMA, un UB ...



"AMA" ?? c'est pour un sondage ou quoi ? Si tu crois que c'est un UB
donne chapitres et versets.

Mais ça me paraît hautement improbable, il suffit de penser à une simple
redirection de stdin depuis un fichier dans lequel on a envoyé une suite
de chaînes, terminées par un 0 comme il se doit.
Avatar
espie
In article ,
-ed- wrote:
On 9 nov, 12:54, (Marc Espie) wrote:
De meme, parfois, tu aimerais bien pouvoir dire "okay, je vire tout ce qui
est en attente sur stdio, la maintenant, parce que je vais interagir
directement avec l'utilisateur, et que ca impose de gicler tout ce qu'il
a entre jusqu'ici".





Cette opération doit etre faite systématiquement et de manière
'intelligente' après chaque appel à une fonction de saisie. C'est
tout. L'ordre à respecter absolument est :



1 - Saisir
2 - Nettoyer



et pas le contraire comme on le voit trop souvent. On ne peut jamais
présumer ce de qui c'est passé avant, on ne sait donc pas comment
vider le flux. Par contre, après une saisie, on sait parfaitement ce
qu'il y a à faire (ça dépend de la fonction, parfois de la valeur
saisie etc.).



Cette méthode est évidemment portable.



Oui, mais non. Il y a des cas non portables dans les interfaces utilisateur,
pour tout un ensemble de raisons.

En particulier, tu reprends souvent un flux sur lequel tu n'as pas eu la
main, donc il faut parfois pouvoir le nettoyer d'abord.

Typiquement, l'interface Unix dont je parlais (termios) n'est pas faite
selon ton modele du monde, et le resultat n'est pas concu pour interagir
comme tu le voudrais....
Avatar
espie
In article <4af834be$0$1439$,
candide wrote:
-ed- a écrit :

Ce qui n'est pas compatible avec les fonctions C standards de
traitement des chaines... dont fgets() !



Si tu commences à confondre stdio.h et string.h ...

fgets ne traite pas de chaîne (=string en C ie char* terminé par 0).




Faire entrer un 0 dans un stdin est AMA, un UB ...



"AMA" ?? c'est pour un sondage ou quoi ? Si tu crois que c'est un UB
donne chapitres et versets.



Malheureusement d'accord avec candide, pour une fois.

stdin est un simple flux de caracteres. On suppose d'habitude qu'il n'y
a pas de 0 dessus (et tout ce qui concerne les fonctions classiques de
gestion de chaine de caracteres du C fait pareil), mais il n'y a pas
vraiment moyen d'en etre sur.

En regle generale, si on utilise des fonctions telles que fgets,
ca veut dire qu'on a de bonnes chances de perdre des choses si on tombe
sur un '' dans le buffer. Si on veut traiter des entrees quelconques
qui peuvent comporter des 0, fgets n'est pas une fonction appropriee...
Avec fgets, on considere qu'il n'y a pas de 0 dans notre entree, et que
s'il y en a, on va juste laisser tomber silencieusement le fragment de
chaine qui suit.

Il n'y a pas d'UB la-dedans: la spec de fgets est parfaitement claire:
on s'arrete seulement sur un 'n', un EOF, ou un buffer tout plein.
On continue au-dela d'un ''...
Avatar
batyann811
-ed- a écrit :

Le Pascal standard ne gère les les flux.



Et quand un programme commence par exemple par :

program Test(input, output);

Tu considères que ce ne sont pas des flux ?

Qu'il y ait moins de fonctions pour gérer les flux en pascal qu'en c je
veux bien (mais elle sont mieux foutues en pascal) mais de là à dire
qu'il n'y a pas de flux en pascal standard. A moins qu'on n'ait pas la
même définitions de flux.