Реализация “хвост-f” в C++

Я хочу создать маленький код в C++ с той же функциональностью как "хвост-f": наблюдайте за новыми строками в текстовом файле и покажите им в стандартном выводе.

Идея состоит в том, чтобы иметь поток, который контролирует файл

Существует ли простой способ сделать это, не открываясь и закрывая файл каждый раз?

15
задан Hamming 23 April 2010 в 07:48
поделиться

3 ответа

Я читал это в одном из руководств 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 ++.

1
ответ дан 1 December 2019 в 02:10
поделиться

Просто продолжайте читать файл. Если чтение не удалось, ничего не делайте. Нет необходимости многократно открывать и закрывать его. Однако вы обнаружите, что для отслеживания файла гораздо эффективнее использовать специальные функции операционной системы, если ваша ОС их предоставляет.

13
ответ дан 1 December 2019 в 02:10
поделиться

Взгляните на inotify в Linux или kqueue в Mac OS.

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

13
ответ дан 1 December 2019 в 02:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: