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

Vider le buffer associe a stdin

98 réponses
Avatar
korchkidu
Bonjour,

je me pose une question par rapport a la maniere classique de vider le
buffer associe a stdin:

c = getchar();
if (c != ’\n’)
while ( (getchar()) != ’\n’) {
};

Que se passe t-il si stdin ne contient aucun \n? (fichier contenant une
ligne mais aucun \n par exemple). Dans ce cas, il me semble que l'on
pourrait avoir un probleme non?

Comment feriez vous pour resoudre ce probleme? (J'ai bien une petite
idee mais je prefere savoir si c'est la bonne..;) )

Merci d'avance pour vos reponses,
K.

10 réponses

1 2 3 4 5
Avatar
Antoine Leca
En 4182041b$, korchkidu va escriure:
je me pose une question par rapport a la maniere classique de vider le
buffer associe a stdin:

c = getchar();
if (c != ’n’)
while ( (getchar()) != ’n’) {
};

Que se passe t-il si stdin ne contient aucun n? (fichier contenant
une ligne mais aucun n par exemple). Dans ce cas, il me semble que
l'on pourrait avoir un probleme non?


Il « suffit » de faire les choses comme il faut et _aussi_ tester que c ne
vaut pas EOF.


Antoine

Avatar
Marc Boyer
korchkidu wrote:
Bonjour,

je me pose une question par rapport a la maniere classique de vider le
buffer associe a stdin:

c = getchar();
if (c != ’n’)
while ( (getchar()) != ’n’) {
};


C'est la manière classique ?

Que se passe t-il si stdin ne contient aucun n? (fichier contenant une
ligne mais aucun n par exemple). Dans ce cas, il me semble que l'on
pourrait avoir un probleme non?

Comment feriez vous pour resoudre ce probleme? (J'ai bien une petite
idee mais je prefere savoir si c'est la bonne..;) )


void skeep_line(FILE* in){
int c;
do {
c= getchar(in);
} while( c != 'n' && c != EOF);
}

Non ?

Marc Boyer
--
Je ne respecte plus le code de la route à vélo depuis une double fracture
due au fait que j'étais le seul à le respecter.

Avatar
DINH Viêt Hoà

void skeep_line(FILE* in){
int c;
do {
c= getchar(in);
} while( c != 'n' && c != EOF);
}


- void skeep_line(FILE* in){
+ void skip_line(FILE* in){

--
DINH V. Hoa,

"Je me demande comment ça se fait qu'un tel génie n'ait pas déjà été
repéré par les grosses boites d'info de la planète." -- FiLH

Avatar
korchkidu
Marc Boyer wrote:
korchkidu wrote:

Bonjour,

je me pose une question par rapport a la maniere classique de vider le
buffer associe a stdin:

c = getchar();
if (c != ’n’)
while ( (getchar()) != ’n’) {
};



C'est la manière classique ?


C'est celle qui est detaillee dans la FAQ. C'est effectivement ce que
j'entendais par classique..;)

http://www.isty-info.uvsq.fr/~rumeau/fclc/fclc0014.html#q_4

A moins que celle-ci ne soit pas la bonne....

K.


Avatar
korchkidu
DINH Viêt Hoà wrote:



void skeep_line(FILE* in){
int c;
do {
c= getchar(in);
} while( c != 'n' && c != EOF);
}



- void skeep_line(FILE* in){
+ void skip_line(FILE* in){



C'est la solution que nous avons utilisee (qui parait logique mais des
fois...)

Merci a tous pour vos reponses,
K.


Avatar
Yves ROMAN

Marc Boyer wrote:
korchkidu wrote:

Bonjour,

je me pose une question par rapport a la maniere classique de vider le
buffer associe a stdin:

c = getchar();
if (c != ’n’)
while ( (getchar()) != ’n’) {
};



C'est la manière classique ?


C'est celle qui est detaillee dans la FAQ. C'est effectivement ce que
j'entendais par classique..;)

http://www.isty-info.uvsq.fr/~rumeau/fclc/fclc0014.html#q_4

A moins que celle-ci ne soit pas la bonne....



C'est bien la bonne.

Il faudrait effectivement corriger la FAQ car cet exemple boucle sans fin en cas
de dernière ligne sans 'n'
(difficile avec un clavier, mais possible avec des redirections)



Avatar
Horst Kraemer
korchkidu wrote:

Bonjour,

je me pose une question par rapport a la maniere classique de vider le
buffer associe a stdin:

c = getchar();
if (c != ’n’)
while ( (getchar()) != ’n’) {
};

Que se passe t-il si stdin ne contient aucun n? (fichier contenant une
ligne mais aucun n par exemple). Dans ce cas, il me semble que l'on
pourrait avoir un probleme non?


D'abord je ne comprends pas la différence entre le code ci-haut (FAQ)
et un simple

while ( getchar()!='n' );

Dans mon catéchisme

if (getchar()!='n')
if (getchar()!='n')
if (getchar()!='n')
if (getchar()!='n')
if (getchar()!='n')
if (getchar()!='n')
if (getchar()!='n')
while (getchar()!='n') {}

équivaut à

while (getchar()!='n');

;-)


Si la ligne n'est pas terminée par n, alors on aura le problème que
la boucle ne termine jamais parce que getchar() renvoie EOF ad
infinitum...

A remplacer par

int c;
...
while ( (c=getchar())!=EOF && c!='n' );

if (c==EOF) {
/* fin du fichier ou erreur de lecture */
}
else { /* final n caught...*/ }


--
Horst

--
Lâche pas la patate!

Avatar
Emmanuel Delahaye
korchkidu wrote on 29/10/04 :
Bonjour,

je me pose une question par rapport a la maniere classique de vider le buffer
associe a stdin:


Si le programme est bien écrit (à base de fgets()), il n'y a pas
besoin. Affaire suivante...

--
Emmanuel
The C-FAQ: http://www.eskimo.com/~scs/C-faq/faq.html
The C-library: http://www.dinkumware.com/refxc.html

"C is a sharp tool"

Avatar
Emmanuel Delahaye
korchkidu wrote on 29/10/04 :
c = getchar();
if (c != ?n?)
while ( (getchar()) != ?n?) {
};


C'est la manière classique ?


C'est celle qui est detaillee dans la FAQ. C'est effectivement ce que
j'entendais par classique..;)

http://www.isty-info.uvsq.fr/~rumeau/fclc/fclc0014.html#q_4

A moins que celle-ci ne soit pas la bonne....


Non, pas bon. La FAQ devrait être révisée.

--
Emmanuel
The C-FAQ: http://www.eskimo.com/~scs/C-faq/faq.html
The C-library: http://www.dinkumware.com/refxc.html

"C is a sharp tool"



Avatar
drkm
Horst Kraemer writes:

korchkidu wrote:

c = getchar();
if (c != ’n’)
while ( (getchar()) != ’n’) {
};


D'abord je ne comprends pas la différence entre le code ci-haut (FAQ)
et un simple

while ( getchar()!='n' );


La valeur de c ?

--drkm


1 2 3 4 5