Я хочу создать маленький код в C++ с той же функциональностью как "хвост-f": наблюдайте за новыми строками в текстовом файле и покажите им в стандартном выводе.
Идея состоит в том, чтобы иметь поток, который контролирует файл
Существует ли простой способ сделать это, не открываясь и закрывая файл каждый раз?
Я читал это в одном из руководств Perl , но он легко переводится на стандартный C, который, в свою очередь, можно перевести на istream
s.
seek FILEHANDLE,POSITION,WHENCE
Sets FILEHANDLE's position, just like the "fseek" call of
"stdio".
<...>
A WHENCE of 1 ("SEEK_CUR") is useful for not moving the file
position:
seek(TEST,0,1);
This is also useful for applications emulating "tail -f". Once
you hit EOF on your read, and then sleep for a while, you might
have to stick in a seek() to reset things. The "seek" doesn't
change the current position, but it does clear the end-of-file
condition on the handle, so that the next "<FILE>" makes Perl
try again to read something. We hope.
Насколько я помню, fseek
называется iostream :: seekg
. Таким образом, вы должны в основном делать то же самое: искать до конца файла, затем засыпать и снова искать с флагом ios_base :: cur
, чтобы обновить конец файла и прочитать некоторые другие данные.
Вместо спящего режима
, вы можете использовать inotify, как предложено в другом ответе , чтобы засыпать (фактически блокировать при чтении из эмулированного файла) ровно до тех пор, пока файл не будет обновлено / закрыто. Но это специфично для Linux и не является стандартным C ++.
Просто продолжайте читать файл. Если чтение не удалось, ничего не делайте. Нет необходимости многократно открывать и закрывать его. Однако вы обнаружите, что для отслеживания файла гораздо эффективнее использовать специальные функции операционной системы, если ваша ОС их предоставляет.
Взгляните на inotify в Linux или kqueue в Mac OS.
Inotify - это подсистема ядра Linux, которая позволяет вам подписываться на события в файлах и сообщит вашему приложению, когда в вашем файле произойдет ошибка.