OVH Cloud OVH Cloud

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

6 7 8 9 10
Avatar
espie
In article <4b0bf8c0$0$969$,
Richard Delorme wrote:
Le 24/11/2009 15:47, Marc Espie a écrit :

C'est normal, sous certains OS, dont ceux de Microsoft, la fin de ligne
contient deux caractères ("nr" ou le contraire) au lien d'un seul
("n") sous Unix.



Euh non, ce que tu decris, c'est une implementation "non conforme" ou du
moins qui a decide de ne pas implementer la distinction flux binaire/flux
texte.



Tous les Unix sont donc non conformes ?



... et sur lesquels les formats de fichiers concernes sont effectivement
differents, ce qui est le cas sur windows.
Avatar
espie
In article ,
Jean-Marc Bourguet wrote:
(Marc Espie) writes:

De facon encore plus drole, d'apres 7.19.2.2, il y a tres peu
d'implementations standard dans la nature... c'est frequent d'avoir des
espaces avant le 'n', par exemple).



Quel probleme y a-t'il?

Whether space characters that are written out immediately before a
new-line character
appear when read in is implementation-defined.



Tu as raison, j'ai lu un peut vite, j'etais sur le paragraphe du dessus,
qui expliquait dans quelle mesure on relit ce qui a ete ecrit...
Avatar
espie
In article <heh122$fkl$,
Antoine Leca wrote:
while (*s == 'n' || *s == 'r') {
*s-- = '';
}



Oui ; même si c'est inutile au vu de la norme, c'est en effet une
manière solide de faire.



C'est surtout une maniere fausse, ca s'appelle un buffer underflow....
Avatar
Antoine Leca
Marc Espie a écrit :
In article <heh122$fkl$,
Antoine Leca wrote:
while (*s == 'n' || *s == 'r') {
*s-- = '';
}


Oui ; même si c'est inutile au vu de la norme, c'est en effet une
manière solide de faire.



C'est surtout une maniere fausse, ca s'appelle un buffer underflow....



Tu as raison, j'ai lu un peu trop vite, j'étais sur l'idée du paragraphe
du dessus, qui traitait des caractères CR et LF...


Antoine
Avatar
-ed-
On 24 nov, 12:49, Richard Delorme wrote:
C'est normal, sous certains OS, dont ceux de Microsoft, la fin de ligne
contient deux caractères ("nr" ou le contraire) au lien d'un seul
("n") sous Unix.
Quelque soit l'OS, si s est un pointeur vers le dernier caractère non
nul de la chaine, il suffit de vérifier son contenu pour effacer les
caractères de fin de ligne :

while (*s == 'n' || *s == 'r') {
     *s-- = '';

}



Non. Vu du c, et dans un flux ouvert en mode texte, une fin de ligne
est toujours 'n', quelque soit ce que fait l'OS (n, r ou rn).
Avatar
-ed-
On 24 nov, 17:19, Antoine Leca wrote:
> while (*s == 'n' || *s == 'r') {
>     *s-- = '';
> }

Oui ; même si c'est inutile au vu de la norme, c'est en effet une
manière solide de faire.



Si le flux est ouvert en mode texte, le test de 'r' est inutile à
moins qu'il s'agisse d'être compatible evec des implémentations non
conformes... Si c'est le cas, on se s'en sort plus...
.
Avatar
bpascal123
On 24 nov, 17:10, Antoine Leca wrote:
Pascal écrivit :

> Est-ce que fgets a un comportement différent selon l'OS (Djgpp
> Microsoft xp ou Linux Gcc) ?

Non.

> Parce que sous Windows le pointeur se
> trouve 1 position supplémentaire après la fin de la chaîne saisie

Huh ? Peux-tu préciser le compilateur utilisé et les options de
compilations, s'il te plaît.

Antoine



Sous Windows : djgpp
Linux : gcc
pas d'option de compilation que je sache (niveau débutant) : gcc
fichier.c -o fichier.exe ou gcc fichier.c -o fichier
Avatar
candide
-ed- a écrit :
On 24 nov, 17:19, Antoine Leca wrote:
while (*s == 'n' || *s == 'r') {
*s-- = '';
}


Oui ; même si c'est inutile au vu de la norme, c'est en effet une
manière solide de faire.



Si le flux est ouvert en mode texte, le test de 'r' est inutile à
moins qu'il s'agisse d'être compatible evec des implémentations non
conformes... Si c'est le cas, on se s'en sort plus...
.




Non conformes ? ce n'est pas la question. La Norme dit :

5.2.2 Character display semantics
(...)
Each of these escape sequences shall produce a unique
implementation-defined value which can be stored in a single char object.
The external representations in a text file need not be identical to the
internal representations, and are outside the scope of this
International Standard.


et le Rationale de confirmer :

Although ISO/IEC 646 deprecates the combination of the motion to the
next line with a motion to the initial position on the line, the C
Standard uses new-line to designate the end-of-line internal code
represented by the escape sequence 'n'. While this ambiguity is perhaps
unfortunate, use of the term in the latter sense is nearly universal
within the C community. But the knowledge that this internal code has
numerous external representations depending upon operating system and
medium is equally widespread.
Avatar
candide
a écrit :

pas d'option de compilation que je sache (niveau débutant) : gcc
fichier.c -o fichier.exe ou gcc fichier.c -o fichier




Quel que soit le niveau, il est impensable de ne pas compiler avec
options allumées (minimum -Wall -Wextra), c'est vraiment le B-A-BA. Tout
cours (oral ou écrit) qui n'insiste pas sur cela doit faire l'objet des
plus vives suspicions.
Avatar
-ed-
On 25 nov, 23:06, candide wrote:
-ed- a écrit :

> On 24 nov, 17:19, Antoine Leca wrote:
>>> while (*s == 'n' || *s == 'r') {
>>>     *s-- = '';
>>> }
>> Oui ; même si c'est inutile au vu de la norme, c'est en effet une
>> manière solide de faire.

> Si le flux est ouvert en mode texte, le test de 'r' est inutile à
> moins qu'il s'agisse d'être compatible evec des implémentatio ns non
> conformes... Si c'est le cas, on se s'en sort plus...
> .

Non conformes ? ce n'est pas la question. La Norme dit :

5.2.2 Character display semantics
(...)
Each of these escape sequences shall produce a unique
implementation-defined value which can be stored in a single char object.
The external representations in a text file need not be identical to the
internal representations, and are outside the scope of this
International Standard.

et le Rationale de confirmer :

Although ISO/IEC 646 deprecates the combination of the motion to the
next line with a motion to the initial position on the line, the C
Standard uses new-line to designate the end-of-line internal code
represented by the escape sequence 'n'. While this ambiguity is perhaps
unfortunate, use of the term in the latter sense is nearly universal
within the C community. But the knowledge that this internal code has
numerous external representations depending upon operating system and
medium is equally widespread.



Est-ce que tu comprends la différence entre représentation extern e (ce
qu'il y a physiquement dans le flux) et représentation interne (ce que
"voit" le C) ?

En binaire, il n'y a pas de différence, mais en mode texte il peut y
avoir des différences, selon le système :

Je le répète, le caractère 'n' vu du C produit dans un flux texte
soit

LF (en C 'n') sous Unix et ses clones,
CR (en C 'r') sous Mac non unixoïde.
CRLF (en C 'r''n') sous DOS et Windows.

http://www.bien-programmer.fr/notes.php#fichiers

Si tu veux travailler avec les valeurs réelles, utilise le mode
binaire (c'est ce qu'on fait pour écrire un convertisseur comme
unix2dos etc.).
6 7 8 9 10