2015-09-20 2 views
0

У меня есть программа, которую я пытаюсь написать, которая постоянно контролирует файл журнала и выводит определенные элементы в новый файл.Очистка бита eof не работает с циклом while

Я использую по существу.

for (int i = 1; i < y; i ++) 
    getline(read, line); // skips to the last known end 

while (getline(read, line)) 
{ 
cout << line; 
} 

read.clear(); 

Я также отслеживаю линию, на которой я нахожусь, только используя оператор инкремента по переменной. В конце файла я очищаю бит eof и ища последнюю строку, на которой я был. От использования отладчика кажется, что он работает. Я извлекаю следующую строку в файле, когда ее записывают, но когда я перезвоню на мой while (getline(read,line));, он пропускает цикл while, почему?

  • программа считывает последнюю строку в файле.
  • Спит в течение 5 минут.
  • У входного файла были добавлены новые строки от третьего лица.
  • После сна он просыпается и возвращается к циклу while.
  • Он успешно извлекает новые строки из ввода. Но не в введите время цикла снова
+2

'seekg (y)' ищет смещение байта 'y', а не номер строки' y'. Вам нужно использовать 'tellg()' и помнить смещение байта нужной строки, чтобы вы могли вернуться к нему позже. –

+0

@IgorTandetnik О, я ошибся. Я использую цикл for, чтобы пропустить getline до конца. Я обновил сообщение. Я ничего не искал. – Mishap

+0

Есть ли перемотка (искать начало) где-то? Без этого кода нет никакого смысла. –

ответ

1

При использовании std::getline() в конце файла как std::iostate::eofbit и std::iostate::failbit установлены. Фактически, это std::iostate::failbit, что приводит к выходу цикла. Перед любым поиском вам нужно очистить оба этих флага.

Для системы, которая должна использовать IOStreams, я бы на самом деле не стал читать ведущие строки, а просто немного подождать, очистить флаги и повторить попытку. Основная проблема заключается в обнаружении, читается ли полная строка, которая может быть выполнена простым чтением отдельных символов, например, с использованием std::istreambuf_iterator<char>.

В противном случае я бы искал системный API, который предоставляет некоторую индикацию наличия новых данных в файле. Старая система обычно не предоставляет таких средств, но более новая система обычно имеет некоторый интерфейс, основанный на событиях, который может использоваться для получения новых доступных данных. Преимуществом обычно является то, что процессы не опросают новые данные, но ожидают ожидания, пока не получат уведомление о новых данных. Я не использовал его сам, но кажется, что libuv делает этот вид операций в некоторой платформо-независимой форме.

+0

Я в замешательстве, 'read.clear()' не делает этого? – Mishap