2008-08-22 8 views

Répondre

5

Vous pouvez utiliser fseek() pour effacer la condition eof sur le flux. Essentiellement, lisez à la fin du fichier, dormez pendant un moment, fseek() (sans changer votre position) pour effacer eof, la lecture à la fin du fichier à nouveau. laver, rincer, répéter. man fseek (3) pour plus de détails.

Voici à quoi ça ressemble en perl. Perl seek() est essentiellement une enveloppe pour fseek (3), de sorte que la logique est la même:

wembley 0 /home/jj33/swap >#> cat p 
my $f = shift; 
open(I, "<$f") || die "Couldn't open $f: $!\n"; 

while (1) { 
    seek(I, 0, 1); 
    while (defined(my $l = <I>)) { 
    print "Got: $l"; 
    } 
    print "Hit EOF, sleeping\n"; 
    sleep(10); 
} 
wembley 0 /home/jj33/swap >#> cat tfile 
This is 
some 
text 
in 
a file 
wembley 0 /home/jj33/swap >#> perl p tfile 
Got: This is 
Got: some 
Got: text 
Got: in 
Got: a file 
Hit EOF, sleeping 

Puis, dans une autre session:

wembley 0 /home/jj33/swap > echo "another line of text" >> tfile 

Et de retour à la sortie du programme original:

Hit EOF, sleeping 
Got: another line of text 
Hit EOF, sleeping 
0

See here

Vous pouvez soit appeler à la queue et de récupérer le flux de retour dans votre application, ou comme il est open source, peut-être essayer de tirer dans votre propre code.

En outre, il est possible en C++ iostream d'ouvrir un fichier pour l'affichage uniquement et juste de lire jusqu'à la fin, tout en tamponnant les 10-20 dernières lignes, puis de le sortir.

0

Le programme queue est open source, vous pouvez donc faire référence à cela. Je me suis posé la même question et j'ai regardé le code tout à l'heure, pensant que ce serait assez simple, mais j'ai été surpris de voir à quel point c'était complexe. Il y a beaucoup de pièges à prendre en compte.