У меня есть программа, в которой мне очень часто нужно писать текстовые строки в файл журнала. Я хотел бы ограничить количество строк в файле журнала до 1000. Когда я пишу строки в файл, он должен добавлять их нормально. Как только файл достигнет 1000 строк, я хотел бы избавиться от первой строки, а затем добавить новую. Кто-нибудь знает, есть ли способ сделать это, не переписывая весь файл каждый раз?Алгоритм записи ограниченного количества строк в текстовый файл
ответ
Каждый раз, когда вы хотите регистрироваться, вы можете открыть файл, прочитать индекс записи, перейти в позицию и записать запись в фиксированной ширине. Когда ваш индекс попадает на ваш верхний порог, просто установите его на 0.
Есть много предупреждений об этом, однако, во-первых, каждая соответствующая запись в журнале (при условии, что вы закрываете файл между ними) потребует открытия, чтения, поиска, записи, поиска, записи и близко - найдите свой индекс, перейдите к нему, напишите новую запись, а затем обновите свой индекс. У вас также есть неотъемлемые проблемы написания элемента данных фиксированного размера. Кроме того, пользовательский читатель будет зависеть от вашего контента, чтобы узнать, где находится «начало» файла. Большинство людей ожидают, что «линия 1» станет первой линией.
Я гораздо больше сторонник просто для того, чтобы просто иметь несколько файлов и «перекатывать» их, чтобы каждый файл сам по себе был согласованным, но если вам нужен только один файл с фиксированным количеством строк, идея может работать.
@ user2848097 Я думаю, что у вас есть лучшее представление о том, как сделать это эффективным, чем я опубликовал, но если это вам помогло, я рад. –
Я держу каждую строку текста в круговом буфере. Я отслеживаю последний индекс и использую это, чтобы определить, какой заказ записать в файл. Это удивительно эффективно, даже с 1000 линиями. Благодаря! –
Как правило, это немного лучше для случая, подобного этому, чтобы удалить более одной строки за раз с самого начала.
То есть, если ваш предел составляет 1000 строк, и вы нажмете 1000 строк, удалите первые 300 или около того, а затем возобновите запись. Таким образом, вы не выполняете операцию удаления с каждой отдельной строкой, написанной после этого, только каждые 300 раз. Если вам нужно сохранить 1000 строк, то вместо этого сохранить до 1300 и удалить 300, когда достигнет 1300.
Все файлы должны быть выровнены по размеру кластера FS. Нет, нет. Вы можете добавить строку в файл, но вы не можете удалить первую строку без перезаписи файлов. Вы можете использовать по 2 файла по очереди. Или используйте некоторый буфер в памяти и периодически промывайте его.
Я думаю, вам все равно придется сканировать файл, чтобы узнать, сколько строк в файле в данный момент. В этом случае вы можете поместить его в какой-то буфер, который вы можете легко добавить и удалить. Затем вы выполните свое ведение журнала, и когда вы закончите, вы можете «переписать» файл с помощью буфера (или только последних 1000 строк). Другие варианты обсуждаются выше. И да, старайтесь избегать удаления строк. Как правило, это дорогостоящая операция.
Я нашел некоторые подобные темы здесь и на CodeProject:
Flexible logger class using standard streams in C++
http://www.codeproject.com/Articles/584794/Simple-logger-for-Cplusplus
Надеется, что вы найдете их полезными :)
Когда вы хотите использовать только один файл, а длина линии не являются постоянной, нет никакого способа, без перезаписи весь файл.
В зависимости от того, как часто вы добавляете файл, я не вижу никаких проблем с этим. 1000 строк около 100 символов составляют всего около 100 кб, что мало. Кроме того, вы можете добавить некоторый гистерезис.
Однако:
- Если длина линии постоянна (или жесткое ограничение длину линии некоторых постоянная), можно просто переписать старую линию. Но тогда вам нужно отслеживать позиции файла журнала старых/новых строк.
- Я бы использовал два файла: первый, где вы добавляете строки. Когда файл будет заполнен, переименуйте его на второй и заполните сначала с начала.
- 1. записи в текстовый файл
- 2. Алгоритм двоичного поиска: текстовый файл для каждой записи в массиве
- 3. рекурсивный алгоритм ограниченного ранца
- 4. Отображение ограниченного количества записей в jsp
- 5. Чтобы цвет ограниченного количества строк в мерзавце войти --oneline
- 6. Удаление новых строк при записи в текстовый файл в php
- 7. создание записи в текстовый файл
- 8. ActiveModel Serializer посылая все записи вместо указанного ограниченного количества
- 9. Поддержка ограниченного количества валют в какао (Touch)
- 10. записи в текстовый файл и читать этот текстовый файл
- 11. Добавление строк в текстовый файл
- 12. Поддержка только ограниченного количества языков
- 13. Подсчет количества выходов переменной в текстовый файл
- 14. записи строк в файл
- 15. Как взломать MySQL GROUP_CONCAT для извлечения ограниченного количества строк?
- 16. Saving SHA1 алгоритм выводит в текстовый файл
- 17. Алгоритм сжатия большого количества маленьких строк?
- 18. Unix текстовый файл махровые записи
- 19. Добавление новых строк текста в текстовый файл
- 20. Запись миллиона строк в текстовый файл
- 21. Разделить текстовый файл для каждого x строк
- 22. Python записи в текстовый файл после определенного столбца
- 23. Сканировать текстовый файл для строк
- 24. Ограничить поиск ограниченного количества записей Loop
- 25. Остановить sys.stdout от записи в текстовый файл
- 26. Пропуск строки при записи в текстовый файл
- 27. записи в текстовый файл несколько раз андроид
- 28. Сбой при записи в текстовый файл
- 29. Ошибка записи данных в текстовый файл
- 30. Секундомер для записи результатов в текстовый файл
Счетчик и оператор MOD? – Pol0nium
Действительно ли нужно очищать каждую строку или вы можете писать во временный буфер? – jrok
Вы можете превратить файл в круговой буфер, если вы выделяете фиксированный размер для каждой строки. Сделайте первую строку текущим индексом записи, а затем сделайте все остальные строки определенной шириной. Когда вы нажмете нужный макс, просто вернитесь к индексу 0. –