Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > C/C++: Общие вопросы > Как вставить предпоследню строку файлового потока? |
Автор: ТарасАтавин 18.9.2013, 08:46 | ||||||||||||||||||||||||
Есть переменная
|
Автор: bsa 18.9.2013, 09:42 |
файл лога открывают один раз на все время работы программы (есть конечно варианты, но тебя они только запутают). А ты зачем-то открываешь и закрываешь при каждой записи. Это лишняя нагрузка на систему. |
Автор: ТарасАтавин 18.9.2013, 11:43 |
Я пробовал открывать один раз и как раз запутался. Кроме того, сейчас мне надо логировать с учётом зависаний, то есть без возможность дойти до close файла, открытого один раз. И как мне разгребать кеширование записи на диск? А открытие/закрытие каждый раз гарантирует, что я увижу ровно то состояние лога, до которого додебажил. И даже если я открою один раз, как это поможет бороться с закрывающим тегом </root>, записанным при предыдущей записи? Если же его каждый раз не писать, то лог не валиден уже из-за того, что в нём вообще нет тега </root> и таким останется до закрытия программы, то есть всегда, так как до своего закрытия она не доходит. При минутах на одну запись лишние доли секунды на открытие/закрытие - не нагрузка. Я ведь сам читаю с браузера каждое состояние лога, анализирую его и только потом дебажу очередной шаг цикла, а это занимает время. Сейчас я вручную удаляю лишние закрывающие теги. Альтернатива, видимо, проанализировать прогу вручную, исправить, а потом также вручную добавить закрывающий тег в уже не нужном логе? Зато будет "меньше" нагрузка на систему. |
Автор: SenkraD 18.9.2013, 12:02 |
ну можно сначала предложить плохое решении:
вариант получше: если вам нужен xml, то может логер нужно сделать на базе того tinyxml или чего-то такого? |
Автор: bsa 20.9.2013, 12:41 | ||
ТарасАтавин, во-первых, если у тебя программа может повисать, то зачем ты выбрал формат xml для ведения лога? В твоем случае формат лога должен быть как можно примитивней. во-вторых, есть такая волшебная штука - когда ты посылаешь в поток std::flush или std::endl, то содержимое потока принудительно сбрасывается на диск. Т.е. если ты виснешь после этого, то данные не потеряются.
Как вариант, в подобных случаях можно использовать внешнее логирование - через отдельный сервис, который только логированием и занимается, а связь с ним через именованный канал или сокет. Пример: syslog и система событий Windows. |
Автор: akizelokro 20.9.2013, 23:59 |
Ну, перейди на wfstream, вроде так по теории должен открываться файл для чтения-записи. И перейди в бинарный режим. Найди место, с которого надо переписать, установи указатель чтения-записи (позицию), перепиши. Отсеки всё лишнее в хвосте файла, если вставка оказалась меньше по размеру заменяемого куска текста. Задача простецкая, вроде все редакторы писали. |
Автор: disputant 21.9.2013, 07:24 | ||
У человека и так лог наверчен незнамо зачем в xml, только ресурсы жрать... А библиотека при каждом открытии-закрытии будет поллностью парсить и полностью переписывать. По-моему, начинать надо с того, что лог вести в обычном, простейшем текстовом формате с соответствующими флажками - сброса кэша + расшаривания для просмотра в другой программе. |
Автор: Dem_max 21.9.2013, 13:40 |
Может проще заюзать какой нить http://pugixml.org/documentation/ |