2008-08-22 5 views

ответ

5

Вы можете использовать fseek(), чтобы очистить условие eof от потока. По существу, читайте до конца файла, некоторое время спать, fseek() (без изменения вашей позиции), чтобы очистить eof, чтение до конца файла снова. промыть, промыть, повторить. man fseek (3) для деталей.

Вот что это похоже на perl. в Perl искать(), по существу, является оболочкой для FSEEK (3), поэтому логика такая же:

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 

Затем в другой сессии:

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

и обратно к первоначальному выводу программы:

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

See here

Вы можете либо взывать к хвосту и получить поток обратно в ваше приложение, или, как это с открытым исходным кодом, может попытаться вытащить его в свой собственный код.

Кроме того, в C++ iostream можно открывать файл только для просмотра и просто читать до конца, буферизируя последние 10-20 строк, а затем выводить его.

0

Я думаю, что вы ищете вызов select() в c/C++. Я нашел копию страницы человека здесь: http://www.opengroup.org/onlinepubs/007908775/xsh/select.html. Выбор принимает файловые дескрипторы в качестве аргументов и сообщает вам, когда один из них изменился и готов к чтению.

0

Хвост программы с открытым исходным кодом, поэтому вы можете ссылаться на это. Я тоже задавался вопросом и смотрел код некоторое время назад, думая, что это будет довольно просто, но я был удивлен, насколько он был сложным. Есть много ошибок, которые нужно учитывать.

Смежные вопросы