Sasie d'un ligne

liliefr2000 Messages postés 2 Date d'inscription mardi 5 octobre 2004 Statut Membre Dernière intervention 23 avril 2005 - 1 janv. 2005 à 19:11
cs_Nashua Messages postés 48 Date d'inscription lundi 29 novembre 2004 Statut Membre Dernière intervention 16 mars 2005 - 4 janv. 2005 à 06:28
bonjour!
jai un probleme lorsque je veux faire une fonction pour saisir une ligne en C!
ma fonction saisir_ligne doi appele une fonction qui saisie un mot (par un scanf) jusqu'a ce qu'on atteigne le caractere de fin de ligne!
mais je ne comprend pas comment on peu rentrer tt les mots a la suite espacé avec des ' ' comme si on tapait une vrai ligne sans avoir besoin de taper entrer a chaque fois qu'on saisie un mot pour pouvoir valider la saisie!et je voudrai aussi massurer que le caractere de fin de ligne correspond bien a taper entrer!
j'espere que ma description de mon probleme n'est pas trop incomprehensible.
merci d'avance

5 réponses

cs_Nashua Messages postés 48 Date d'inscription lundi 29 novembre 2004 Statut Membre Dernière intervention 16 mars 2005
2 janv. 2005 à 06:50
en premier lieu il faut utiliser une fonction telle que getc(), getchar(), ou gets() au lieu de scanf().

gets() recopie les caracteres saisis dans un buffer jusqu'a ce que gets lise un \n ou \r. ( enter ou retour chariot)

getchar(dos) ou getc (unix) retournent le caractere saisi et il faut alors analyser ce caractere pour detecter une fin de ligne (\n). Dans le cas d'unix il faudra configurer le tty pour etre non bloquant.
Dans le cas de windows je pense qu'il existe une fonction non bloquante ( getch????)

Dans tous ces cas attention au debordements de buffer.

Yves
0
plus_plus_fab Messages postés 232 Date d'inscription vendredi 9 janvier 2004 Statut Membre Dernière intervention 8 janvier 2005
2 janv. 2005 à 12:24
getchar() = getc(stdin) ,
et utiliser fgets à la place de l'infame gets pour pallier aux débordements de tampon.
Nashua> comment rendre une terminal non bloquant ? pour une console virtuelle ou un émulateur de terminal xterm éventuellement ?
liliefr2000> Une solution serait de lire une ligne avec fgets, puis en dans un second temps analyser le tampon pour en extraire les mots.
0
cs_Nashua Messages postés 48 Date d'inscription lundi 29 novembre 2004 Statut Membre Dernière intervention 16 mars 2005
3 janv. 2005 à 20:25
<>++fab > desole pour de contre temps, j'ai du me construire un linux vite fait.

Ci -dessous une fonction qui passe la ligne en mode "raw" . juste pour
ne pas rester bloque en attente apres avoir recu 1 caractere. VTIME et
VMIN sont expliques dans le man de termios. Dans mon code on
attend VMIN = 1 caractere et l'on retourne immediatement. il n'y
a pas de timeout VTIME.

**************************************************************************/

#include <stdio.h>

</>
#include <termios.h>



struct termios Line_New_Setting,



Line_Old_Setting;
/***************** un exemple d'utilisation de la fonction ********/
int main(){
int c;
setRawAttr(fileno(stdin));
while(1)
c = fgetc(stdin);

}

/*****************************************************/
int setRawAttr(int fd){
extern struct termios Line_New_Setting,
Line_Old_Setting;

if(tcgetattr(fd,&Line_Old_Setting) < 0) {
perror("Ioctl Get error");
return -1;
}
Line_New_Setting = Line_Old_Setting;

Line_New_Setting.c_lflag &= ~ICANON; /* non canonical mode */
Line_New_Setting.c_lflag &= ~ISIG; /* ignore ^C*/
Line_New_Setting.c_cc[VMIN] = 1; /* return after 1 char has been read */
Line_New_Setting.c_cc[VTIME] = 0; /* in .1 seconds */
Line_New_Setting.c_cc[VQUIT] = 0;
Line_New_Setting.c_lflag &= ~ECHO; /* disable echo */
Line_New_Setting.c_oflag |= (OPOST | ONLCR); /* enable Opost and nl to cr nl conversion */

/* set the new terminal attributes */
if(tcsetattr(fd,TCSAFLUSH,&Line_New_Setting) < 0){
perror("Ioctl Set error");
return -1;
}
return (0);
}



Yves
0
plus_plus_fab Messages postés 232 Date d'inscription vendredi 9 janvier 2004 Statut Membre Dernière intervention 8 janvier 2005
4 janv. 2005 à 01:03
salut,



merci pour ton post, je n'avais jamais utilisé termios.h, c'est intéressant. Je vais étudier ça et potasser le man ...



@+
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_Nashua Messages postés 48 Date d'inscription lundi 29 novembre 2004 Statut Membre Dernière intervention 16 mars 2005
4 janv. 2005 à 06:28
Termios est fantastique pour qui aime "jouer" avec les tty's.

les ioctl () sont tout aussi charmant.


Yves
0
Rejoignez-nous