imposer une fin de chaine par une touche particulière

imposer une fin de chaine par une touche particulière - C - Programmation

Marsh Posté le 13-01-2005 à 00:48:31    

J'aimerai savoir comment faire pour imposer une fin de chaine autrement que par la touche entrée ( caractère fin de ligne \n ). En effet, je voudrais que mon programme lise sur l'entrée standard des caractères jusqu'à ce que je tape la touche '>' et non la touche entrée. Merci pour votre aide.

Reply

Marsh Posté le 13-01-2005 à 00:48:31   

Reply

Marsh Posté le 13-01-2005 à 01:01:19    

canto13 a écrit :

J'aimerai savoir comment faire pour imposer une fin de chaine autrement que par la touche entrée ( caractère fin de ligne \n ). En effet, je voudrais que mon programme lise sur l'entrée standard des caractères jusqu'à ce que je tape la touche '>' et non la touche entrée. Merci pour votre aide.


C'est pas possible.  
 
Si tu y tiens, tu ne doit pas utiliser l'entrée standard (stdin), mais l'entrée clavier directe. C'est pas possible en C standard, mains certains compilateurs fournissent les extensions nécessaires (conio, ncurses...).  
 
Machine ? OS ?


Message édité par Emmanuel Delahaye le 13-01-2005 à 01:02:11

---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 13-01-2005 à 01:09:59    

ah ok je savais pas merci.  
En fait je bosse sur linux. Je dois faire un mini-shell qui doit faire des redirections comme on en fait avec les opérateurs > et < . Et j'avais dans l'idée de délimiter avec le caractère '>' une chaine de caractère qui est en fait la commande qui doit etre redirigée en sortie sur un fichier. Je sais pas si tu vois ce que je veux dire, mais si t'a capté et que tu as une meilleure idée, ca serait vachement sympa de me la communiquer. Merci d'avance.

Reply

Marsh Posté le 13-01-2005 à 01:15:01    

quel rapport avec la saisie ?
 
tu lis une ligne normalement, et si y a un >, tu coupes en 2, à gauche la commande, à droite le fichier

Reply

Marsh Posté le 13-01-2005 à 01:17:15    

Et comment tu fais ca stp?

Reply

Marsh Posté le 13-01-2005 à 01:18:59    

avec les doigts.
 
tu prends ta chaine s
 
p = strchr(s, '>');
 
if(p) {
// redirection
*p = '\0';
filename = p+1;
}
 
et voilà, s c'est la commande, filename le fichier :o

Reply

Marsh Posté le 13-01-2005 à 01:26:10    

En fait, pour mon programme sur les redirections, j'ai une fonction main qui prend 3 arguments. le premier c'est le nom du programme. Le deuxieme c'est la commande à rediriger. Et le 3e c'est le fichier qui recoit le résultat de la commande. En fait, j'exécute la commande à rediriger avec system dont l'argument qu'il recoit est le deuxieme. Le problème, c'est que cette commande il la recoit sous la forme d'une chaine de caractères et je suis obligé de mettre des guillemets pour la saisir correctement. T'aurai pas une idée pour éviter de mettre les guillemets et mettre le '>' ?

Reply

Marsh Posté le 13-01-2005 à 02:21:18    

"j'exécute la commande à rediriger avec system" ... genre tu fais presque appel à un autre shell dans ton shell ?
 
 
sinon je comprends rien à ton histoire de guillemet. Tout va bien sans

Reply

Marsh Posté le 13-01-2005 à 03:03:19    

Faut pas faire system(). Faut faire execve().

Reply

Marsh Posté le 13-01-2005 à 11:17:34    

Taz a écrit :

"j'exécute la commande à rediriger avec system" ... genre tu fais presque appel à un autre shell dans ton shell ?
 
 
sinon je comprends rien à ton histoire de guillemet. Tout va bien sans


 
En fait, mon devoir consiste à développer un mini-shell qui a entre-autres, comme particularité de savoir gérer les redirections. En gros faut que je fasse un programme qui permette d'exécuter la commande
" ls -l fichier1 > fichier 2 " par exemple. Pour cela, j'ai redirigé la sortie standard sur "ls -l fichier1" et l'entrée standard sur fichier2. Cependant, pour la commande avant le > , je dois faire un appel à system avec en argument la chaine de caractère "ls -l fichier" que je suis obligé de mettre entre guillemets quand je le tape. En fait je cherche un moyen pour éviter de mettre les guillemets et de faire comprendre au programme d'exécuter la commande avant le caractère > . En fait, ce que j'essai de faire, c'est de faire un programme qui réalise la commande : " commande > fichier " le plus fidèlement possible. Si vous avez des idées, merci beaucoup de me les faire partager. Merci.

Reply

Marsh Posté le 13-01-2005 à 11:17:34   

Reply

Marsh Posté le 13-01-2005 à 12:12:02    

non, n'utilise pas system :o
 
tu dois faire un fork + exec en redirigeant comme il faut les descripteurs de fichiers après le fork.

Reply

Marsh Posté le 13-01-2005 à 12:29:54    

Taz a écrit :

non, n'utilise pas system :o
 
tu dois faire un fork + exec en redirigeant comme il faut les descripteurs de fichiers après le fork.


 
Ok, mais avec exec, je suis obligé de donner en arguments les différents paramètres de la commande dans mon programme et puis il faut que je donne le bon fichier à charger. Ainsi, si je veux faire une commande ls, il faudra que je charge le fichier /bin/ls mais si je veux faire un wc il faudra que je charge /usr/bin/wc . Et donc à chaque fois il faudra que change le fichier à charger en argument dans mon programme en fonction de la commande à réaliser. C'est pour ca que j'ai fait system. A moins que tu puisse charger un fichier ou il y a toutes les commandes... Mais alors, il faudra quand meme que je tape:
argv[1]= cmd;
argv[2]= "-l"; // par exemple
argv[3]= "fichier1";
Et comment faire pour introduire le caractère > ?

Reply

Marsh Posté le 13-01-2005 à 12:33:40    

Bon en gros ma question devient maintenant:
comment faire un programme qui effectue la commande  
"commande > fichier "  ??
Fork? Exec? System?
Merci de détailler votre idée. Je suis pas très fort en programmation comme vous vous en doutez.
Merci à tous pour les réponses.

Reply

Marsh Posté le 13-01-2005 à 12:59:01    

mais "> fichier" ne fais pas partie de la commande bordel. Ton problème, c'est que tu comprends pas ce que fais un shell...

Reply

Marsh Posté le 13-01-2005 à 13:06:12    

Ok, alors puisque je comprend rien, explique moi ce que tu ferais toi?

Reply

Marsh Posté le 13-01-2005 à 13:14:01    

tu lis une ligne
tu coupes : le chemin du programme, ses arguments, la redirection si nécessaire et le fichier
tu fork
tu positionnes les descripteurs de fichiers comme demandé par la redirection
tu fais un exec du programme avec ses arguments

Reply

Marsh Posté le 13-01-2005 à 13:41:26    

Excuse moi mais je suis vraiment mauvais. Tu peux me donner un petit exemple s'il te plait? Merci.

Reply

Marsh Posté le 13-01-2005 à 14:10:16    

les 3 premiers points, tu dois pouvoir les faire tout seul déjà.

Reply

Marsh Posté le 13-01-2005 à 14:20:18    

Ben justement, c'est les 2 derniers que je pense pouvoir faire.  
Sinon, je lis ma ligne avec scanf par exemple et je fais strchr c'est ca?

Reply

Marsh Posté le 13-01-2005 à 14:44:46    

non, tu lis ta ligne avec fgets
après oui, tu tronçonnes avec strchr.

Reply

Marsh Posté le 13-01-2005 à 14:48:08    

j'ai jamais utilisé strchr. Comment je fais pour tronconner par exemple " ls -l fichier1 > fichier2 " ?
Et une fois que j'ai tronconné, je fais quoi? J'ai pas compris pourquoi je dois créer un processus fils ici.

Reply

Marsh Posté le 13-01-2005 à 15:26:10    

allez, arrête de payer notre tête. Tu sais même pas manipuler une chaîne de caractères, alors raconte pas que tu sais faire un fork, rediriger les descripteur et terminer par un exec.
 
man strchr
man fork
man dup
 

Reply

Marsh Posté le 13-01-2005 à 15:46:50    

Taz a écrit :

allez, arrête de payer notre tête. Tu sais même pas manipuler une chaîne de caractères, alors raconte pas que tu sais faire un fork, rediriger les descripteur et terminer par un exec.
 
man strchr
man fork
man dup


 
attends mec, j'ai jamais dit que je savais parfaitement le faire et que j'étais un dieu de la programmation. Maintenant si ca te fait chier de me répondre parce que j'ai plus de difficultés à capter que toi, et bien tu te dispenses de me répondre tout simplement. Tu penses bien que j'ai autre chose à foutre que me payer ta gueule en te parlant de fork, strch ou dup quand meme! Faut pas déconner non plus.
La programmation c'est pas donné à tout le monde. Alors soit un peu plus indulgent avec les moins balaises stp, merci.

Reply

Marsh Posté le 13-01-2005 à 19:34:49    

savoir manipuler une chaine de caractères, c'est une aptitude fondamentale. Si tu ne l'as pas, ne va pas plus loin.

Reply

Marsh Posté le 13-01-2005 à 23:51:06    

Bon ok, soit. Sinon pour le exec, c'est quel fichier que je charge stp?

Reply

Marsh Posté le 13-01-2005 à 23:52:29    

...

Reply

Marsh Posté le 14-01-2005 à 00:14:34    

Allez, fait pas le rat. Crache le morceau va!

Reply

Marsh Posté le 14-01-2005 à 00:37:22    

c'est ta question qui ne veut rien dire.

Reply

Marsh Posté le 14-01-2005 à 00:41:21    

ah bon, parce que dans les arguments de exec, t'en a pas un qui est la référence d'un fichier à charger???

Reply

Marsh Posté le 14-01-2005 à 00:44:09    

quel fichier ?

Reply

Marsh Posté le 14-01-2005 à 00:45:21    

Finalement, c'est peut-etre toi qui connait pas bien tes cours de programmation....

Reply

Marsh Posté le 14-01-2005 à 00:47:24    

canto13 a écrit :

ah bon, parce que dans les arguments de exec, t'en a pas un qui est la référence d'un fichier à charger???


 [:petrus75]  
 
tu l'as regardée au moins la doc d'exec*?
 
non parce que là Taz t'a tout donné (et même plus), t'as plus qu'à aller te faire les docs [:petrus75]  
 
(d'ailleurs taz je te trouve bien urbain ces temps ci)

canto13 a écrit :

Finalement, c'est peut-etre toi qui connait pas bien tes cours de programmation....


 [:thierry3]


Message édité par masklinn le 14-01-2005 à 00:48:06

---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 14-01-2005 à 00:54:04    

Attends, t'a bien une référence de fichier à donner dans les arguments de exec? Ou sinon mon bouquin est périmé...

Reply

Marsh Posté le 14-01-2005 à 00:59:10    

tu te rends compte que sur un système *n*x, tout est fichier ? alors quand tu dis 'fichier', y a pas plus vague. Tu parles de quoi ?

Reply

Marsh Posté le 14-01-2005 à 01:00:41    

citons Emmanuel, citant Camus

Citation :

Mal nommer les choses c'est ajouter du malheur au monde.

Reply

Marsh Posté le 14-01-2005 à 01:08:11    

Taz a écrit :

tu te rends compte que sur un système *n*x, tout est fichier ? alors quand tu dis 'fichier', y a pas plus vague. Tu parles de quoi ?


 
Je parles de rien, je fais que répéter ce qu'ya marqué sur mon bouquin de programmation où est utilisé le mot "fichier"...  
Par exemple, pour execl("/bin/ls","ls","-l","/",NULL), tu charges le fichier de référence /bin/ls pour exécuter la commande ls -l / avec la fonction main du programme correspondant.
Toi comprendre ce que moi vouloir dire???

Reply

Marsh Posté le 14-01-2005 à 01:09:38    

Maintenant oui : tu n'as pas lu le 'man exec', c'est certain.

Reply

Marsh Posté le 14-01-2005 à 01:11:39    

Je suis pas sur unix la, alors dis moi ce qu'il dit...

Reply

Marsh Posté le 14-01-2005 à 01:13:13    

canto13 a écrit :

Je suis pas sur unix la, alors dis moi ce qu'il dit...


 [:google]  [:google]  [:google]  
 [:google]  http://rulzofpunk.free.fr/smileys/google_fou.gif [:google]  
 [:google]  [:google]  [:google]  
 
 [:regardelafaq]


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 14-01-2005 à 01:19:20    

Non non non, pas de google, dis moi ce qu'elle fait cette fameuse exec...

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed