2013-10-08 3 views
5

У меня есть программа, в которой мне очень часто нужно писать текстовые строки в файл журнала. Я хотел бы ограничить количество строк в файле журнала до 1000. Когда я пишу строки в файл, он должен добавлять их нормально. Как только файл достигнет 1000 строк, я хотел бы избавиться от первой строки, а затем добавить новую. Кто-нибудь знает, есть ли способ сделать это, не переписывая весь файл каждый раз?Алгоритм записи ограниченного количества строк в текстовый файл

+1

Счетчик и оператор MOD? – Pol0nium

+0

Действительно ли нужно очищать каждую строку или вы можете писать во временный буфер? – jrok

+2

Вы можете превратить файл в круговой буфер, если вы выделяете фиксированный размер для каждой строки. Сделайте первую строку текущим индексом записи, а затем сделайте все остальные строки определенной шириной. Когда вы нажмете нужный макс, просто вернитесь к индексу 0. –

ответ

0

Каждый раз, когда вы хотите регистрироваться, вы можете открыть файл, прочитать индекс записи, перейти в позицию и записать запись в фиксированной ширине. Когда ваш индекс попадает на ваш верхний порог, просто установите его на 0.

Есть много предупреждений об этом, однако, во-первых, каждая соответствующая запись в журнале (при условии, что вы закрываете файл между ними) потребует открытия, чтения, поиска, записи, поиска, записи и близко - найдите свой индекс, перейдите к нему, напишите новую запись, а затем обновите свой индекс. У вас также есть неотъемлемые проблемы написания элемента данных фиксированного размера. Кроме того, пользовательский читатель будет зависеть от вашего контента, чтобы узнать, где находится «начало» файла. Большинство людей ожидают, что «линия 1» станет первой линией.

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

+0

@ user2848097 Я думаю, что у вас есть лучшее представление о том, как сделать это эффективным, чем я опубликовал, но если это вам помогло, я рад. –

+0

Я держу каждую строку текста в круговом буфере. Я отслеживаю последний индекс и использую это, чтобы определить, какой заказ записать в файл. Это удивительно эффективно, даже с 1000 линиями. Благодаря! –

1

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

То есть, если ваш предел составляет 1000 строк, и вы нажмете 1000 строк, удалите первые 300 или около того, а затем возобновите запись. Таким образом, вы не выполняете операцию удаления с каждой отдельной строкой, написанной после этого, только каждые 300 раз. Если вам нужно сохранить 1000 строк, то вместо этого сохранить до 1300 и удалить 300, когда достигнет 1300.

1

Все файлы должны быть выровнены по размеру кластера FS. Нет, нет. Вы можете добавить строку в файл, но вы не можете удалить первую строку без перезаписи файлов. Вы можете использовать по 2 файла по очереди. Или используйте некоторый буфер в памяти и периодически промывайте его.

1

Я думаю, вам все равно придется сканировать файл, чтобы узнать, сколько строк в файле в данный момент. В этом случае вы можете поместить его в какой-то буфер, который вы можете легко добавить и удалить. Затем вы выполните свое ведение журнала, и когда вы закончите, вы можете «переписать» файл с помощью буфера (или только последних 1000 строк). Другие варианты обсуждаются выше. И да, старайтесь избегать удаления строк. Как правило, это дорогостоящая операция.

Я нашел некоторые подобные темы здесь и на CodeProject:

Small logger class;

Flexible logger class using standard streams in C++

http://www.codeproject.com/Articles/584794/Simple-logger-for-Cplusplus

Надеется, что вы найдете их полезными :)

0

Когда вы хотите использовать только один файл, а длина линии не являются постоянной, нет никакого способа, без перезаписи весь файл.

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

Однако:

  • Если длина линии постоянна (или жесткое ограничение длину линии некоторых постоянная), можно просто переписать старую линию. Но тогда вам нужно отслеживать позиции файла журнала старых/новых строк.
  • Я бы использовал два файла: первый, где вы добавляете строки. Когда файл будет заполнен, переименуйте его на второй и заполните сначала с начала.
Смежные вопросы