imposer une fin de chaine par une touche particulière - C - Programmation
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 ?
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.
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
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
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 '>' ?
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
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 ? |
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.
Marsh Posté le 13-01-2005 à 12:12:02
non, n'utilise pas system
tu dois faire un fork + exec en redirigeant comme il faut les descripteurs de fichiers après le fork.
Marsh Posté le 13-01-2005 à 12:29:54
Taz a écrit : non, n'utilise pas system |
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 > ?
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.
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...
Marsh Posté le 13-01-2005 à 13:06:12
Ok, alors puisque je comprend rien, explique moi ce que tu ferais toi?
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
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.
Marsh Posté le 13-01-2005 à 14:10:16
les 3 premiers points, tu dois pouvoir les faire tout seul déjà.
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?
Marsh Posté le 13-01-2005 à 14:44:46
non, tu lis ta ligne avec fgets
après oui, tu tronçonnes avec strchr.
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.
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
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. |
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.
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.
Marsh Posté le 13-01-2005 à 23:51:06
Bon ok, soit. Sinon pour le exec, c'est quel fichier que je charge stp?
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???
Marsh Posté le 14-01-2005 à 00:45:21
Finalement, c'est peut-etre toi qui connait pas bien tes cours de programmation....
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??? |
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
(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.... |
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é...
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 ?
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. |
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???
Marsh Posté le 14-01-2005 à 01:09:38
Maintenant oui : tu n'as pas lu le 'man exec', c'est certain.
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... |
Marsh Posté le 14-01-2005 à 01:19:20
Non non non, pas de google, dis moi ce qu'elle fait cette fameuse exec...
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.