PDA

Показать полную графическую версию : Обработка ошибки записи в файл


Apock
20-04-2019, 11:12
Чувствую, что решение банально простое, но что-то интернет мне не дал ответа.
Есть прога, которая сохраняет лог в текстовый файл несколько раз в секунду. И есть моя прога, которая этот лог читает. Дабы не обрабатывать старые строки повторно, сделал следующую процедуру:
Прочитал->очистил файл->через время прочитал снова.
Проблема в том, что иногда совпадает момент записи в файл и моей очистки, что вызывает ошибку моей программы.
Задача в том, чтоб этой ошибки избежать и просто повторить попытку записи.
Пытался так. Не помогает. Хотя мне кажется, что ошибка стала выскакивать реже.

List->Clear(); //Очищаем список
refi: //метка
try
{
List->SaveToFile(file);
}
catch(...)
{
goto refi;
}

Busla
20-04-2019, 12:22
Дабы не обрабатывать старые строки повторно »
а зачем его каждый раз читать с начала? - просто ждите появления в нём новых данных

очистил файл »
просто удаляйте его или переименовывайте

Apock
20-04-2019, 13:10
а зачем его каждый раз читать с начала? - просто ждите появления в нём новых данных »
Реализация сложнее. Как считать информацию из файла начиная с N-строки я не знаю(хотя какой-нибудь метод потокового чтения решил бы много проблем=)). Тем более со временем этот лог-файл разрастётся до размера слона и обрабатывать его будет всё сложнее. Мой метод проще - удалил всё и знаю, что при след.обращении все данные можно считать новыми.
удаляйте его или переименовывайте »
Пробовал удаление. Ошибка при перекрёстной записи также выскакивает.

Iska
20-04-2019, 17:13
Дабы не обрабатывать старые строки повторно, сделал следующую процедуру:
Прочитал->очистил файл->через время прочитал снова.
Проблема в том, что иногда совпадает момент записи в файл и моей очистки, что вызывает ошибку моей программы. »
Не делайте так. Проблема именно в этом.

Как считать информацию из файла начиная с N-строки я не знаю(хотя какой-нибудь метод потокового чтения решил бы много проблем). »
Не существует таких способов в принципе. Чтобы найти N-ную строку, нужно прочитать все предыдущие. Именно поэтому с начала времён такие файлы и именуются файлами последовательного доступа.

Очищать файл должно генерирующее его приложение — по времени, по размеру, або тупо периодически. Если такового функционала нет — Вы можете попробовать:
или переименовывайте »
если генерирующее приложение не «держит» log-файл постоянно открытым. Ваше приложение должно открывать данный файл для чтения в совместном доступе, читать имеющиеся данные, запоминать номер последней прочитанной строки и закрывать файл. При следующем обращении к файлу Вы должны последовательно прочитать/пропустить строки от начала до сохранённого номера последней ранее прочитанной строки.

Busla
20-04-2019, 22:44
Не существует таких способов в принципе. Чтобы найти N-ную строку, нужно прочитать все предыдущие. »
ха-ха-ха
нужно просто запомнить текущую позицию - в принципе все файлы - двоичные

если генерирующее приложение не «держит» log-файл постоянно открытым. »
однозначно же написано, что не держит:
иногда совпадает момент записи в файл и моей очистки, что вызывает ошибку моей программы »
або »нет такого слова (в русском языке)

Ошибка при перекрёстной записи также выскакивает. »
ну так она в приложении читателе - нужно просто повторить операции

какой-нибудь метод потокового чтения решил бы много проблем »
обычно Си/С++ и начинают изучать с потокового чтения и записи - stdio, iostream ;-)

mwz
20-04-2019, 22:54
нет такого слова (в русском языке) »
або АБО, альбо союз ряз., кур., вор. ли, либо, или. Або добыть, або домой (домовь, дома) не быть, зап.; || аль, разве, нежто. Або то, або это, либо. Або ты не слышишь? Або-ще, вот еще, что еще, как бы не так; будто? Або-що, что-нибудь; || хотя и. Дай або-що, что-нибудь. Або-що батька, да хуже свекра, хотя. Або-как, как-нибудь, как попало. :read:

Iska
20-04-2019, 23:15
ха-ха-ха
нужно просто запомнить текущую позицию - в принципе все файлы - двоичные »
Перечитайте, пожалуйста, на что я отвечал.

нет такого слова (в русском языке) »
В Вашем русском языке, может быть, и нет. В моём — есть.

нужно просто повторить операции »
…и потерять непрочитанные записи.

Busla
20-04-2019, 23:44
mwz, ok - в современном русском языке

Iska, и зачем же вы так категорично отвечаете на выдернутые из контекста фразы?

нужно просто повторить операции »
…и потерять непрочитанные записи. »
Множественное число не наводит на мысли, что речь не про единственную операциЮ удаления?




© OSzone.net 2001-2012