2009-03-31 5 views
0

Ok Je dois faire ce programme pour afficher "cal" 3 mois (un mois avant et un mois après) côte à côte, plutôt qu'un seul seul mois il affiche dans n'importe quel Linux/UNIX. Je l'ai fait travailler pour afficher 3 calendrier en utilisant "system(customCommand)" trois fois; mais alors ce n'est pas côte à côte.besoin indice avec une ligne de commande Linux/UNIX personnalisée "cal" en C

Je me suis un peu allusion à utiliser les appels système suivants:

close(..) pipe(..) dup2(..) read(..) and write(..) 

ma question est ce que dois-je commencer? Ai-je besoin de créer un processus fils et de l'attraper dans pipe(..)?

Comment afficher trois calendriers côte à côte.

ex.

February 2009   March 2009    April 2009 
S M Tu W Th F S S M Tu W Th F S S M Tu W Th F S 
1 2 3 4 5 6 7 1 2 3 4 5 6 7    1 2 3 4 
8 9 10 11 12 13 14 8 9 10 11 12 13 14 5 6 7 8 9 10 11 
15 16 17 18 19 20 21 15 16 17 18 19 20 21 12 13 14 15 16 17 18 
22 23 24 25 26 27 28 22 23 24 25 26 27 28 19 20 21 22 23 24 25 
         29 30 31    26 27 28 29 30 

Répondre

6

En supposant que vous voulez écrire vous-même au lieu d'utiliser « cal -3 », ce que je ferais (en pseudo-code):

popen three calls to "cal" with the appropriate args 

while (at least one of the three pipes hasn't hit EOF yet) 
{ 
    read a line from the first if it isn't at EOF 
    pad the results out to a width W, print it 
    read a line from the second if it isn't at EOF 
    pad the results out to a width W, print it 
    read a line from the third if it isn't at EOF 
    print it 
    print "\n" 
} 

pclose all three. 
+0

merci, c'est ce que je cherchais, donc par cela je n'ai pas besoin de créer des processus enfants – Jonathan

+0

popen crée les processus de l'enfant pour vous. vous pouvez faire la même chose avec pipe ou fork/exec si vous préférez –

+0

http://linux.die.net/man/2/pipe a un exemple de code pour le faire à la dure –

3

juste faire

cal -3 
+0

-1: "cal: option inconnue" ... Ce n'est pas une option POSIX, FYI – dwc

+0

+1 de moi. Cela fonctionne parfaitement sur mon système et fait exactement ce que vous voulez. –

+0

En fait, il a raison, j'avais oublié que ça ne fonctionnerait pas sur un terminal Mac, qui est le seul autre unix que j'ai été récemment. La question disait "any linux/unix". –

0

L'approche que je voudrais utiliser pour cela serait de capturer la sortie, il divisé en lignes, et printf les lignes à côté de l'autre. Je le ferais probablement en Perl, cependant, plutôt que C.

Ou simplement utiliser cal -3, si votre cal a.

1

Est-ce que cela ne fonctionne pas?

cal -3

+0

wo jamais pensé à ce sujet. merci pour l'indice. mais j'ai donné l'instruction d'utiliser l'appel système suivant :( – Jonathan

1

Ok, que diriez-vous cal -3?

cal -3 12 2120 pour en faire un mois et une année spéciaux, avec un avant et un après.

6

si « cal -3 » ne fonctionne pas, il suffit utiliser de la pâte :)

$ TERM=linux setterm -regtabs 24 
$ paste <(cal 2 2009) <(cal 3 2009) <(cal 4 2009) 
    febbraio 2009   marzo 2009    aprile 2009 
do lu ma me gi ve sa do lu ma me gi ve sa do lu ma me gi ve sa 
1 2 3 4 5 6 7  1 2 3 4 5 6 7    1 2 3 4 
8 9 10 11 12 13 14  8 9 10 11 12 13 14  5 6 7 8 9 10 11 
15 16 17 18 19 20 21 15 16 17 18 19 20 21 12 13 14 15 16 17 18 
22 23 24 25 26 27 28 22 23 24 25 26 27 28 19 20 21 22 23 24 25 
         29 30 31    26 27 28 29 30 

$ 

(settermignores-regtabs à moins TERM=linux ou TERM=con.)

+0

On dirait que la dernière ligne a un problème –

+0

Est-ce que c'est la façon dont la sortie ressemble, ou est-ce que le formatage a été foiré dans la publication? – ephemient

Questions connexes