Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   Обработка ошибки записи в файл (http://forum.oszone.net/showthread.php?t=340176)

Apock 20-04-2019 11:12 2868456

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

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


Busla 20-04-2019 12:22 2868467

Цитата:

Цитата Apock
Дабы не обрабатывать старые строки повторно »

а зачем его каждый раз читать с начала? - просто ждите появления в нём новых данных

Цитата:

Цитата Apock
очистил файл »

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

Apock 20-04-2019 13:10 2868471

Цитата:

Цитата Busla
а зачем его каждый раз читать с начала? - просто ждите появления в нём новых данных »

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

Цитата Busla
удаляйте его или переименовывайте »

Пробовал удаление. Ошибка при перекрёстной записи также выскакивает.

Iska 20-04-2019 17:13 2868491

Цитата:

Цитата Apock
Дабы не обрабатывать старые строки повторно, сделал следующую процедуру:
Прочитал->очистил файл->через время прочитал снова.
Проблема в том, что иногда совпадает момент записи в файл и моей очистки, что вызывает ошибку моей программы. »

Не делайте так. Проблема именно в этом.

Цитата:

Цитата Apock
Как считать информацию из файла начиная с N-строки я не знаю(хотя какой-нибудь метод потокового чтения решил бы много проблем). »

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

Очищать файл должно генерирующее его приложение — по времени, по размеру, або тупо периодически. Если такового функционала нет — Вы можете попробовать:
Цитата:

Цитата Busla
или переименовывайте »

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

Busla 20-04-2019 22:44 2868518

Цитата:

Цитата Iska
Не существует таких способов в принципе. Чтобы найти N-ную строку, нужно прочитать все предыдущие. »

ха-ха-ха
нужно просто запомнить текущую позицию - в принципе все файлы - двоичные

Цитата:

Цитата Iska
если генерирующее приложение не «держит» log-файл постоянно открытым. »

однозначно же написано, что не держит:
Цитата:

Цитата Apock
иногда совпадает момент записи в файл и моей очистки, что вызывает ошибку моей программы »

Цитата:

Цитата Iska
або »

нет такого слова (в русском языке)


Цитата:

Цитата Apock
Ошибка при перекрёстной записи также выскакивает. »

ну так она в приложении читателе - нужно просто повторить операции

Цитата:

Цитата Apock
какой-нибудь метод потокового чтения решил бы много проблем »

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

mwz 20-04-2019 22:54 2868520

Цитата:

Цитата Busla
нет такого слова (в русском языке) »

Цитата:

Цитата Dahl (Ru-Ru) (к версии ABBYY Lingvo x5)
Толковый словарь живого великорусского языка в 4-х томах. 2-е издание. В.И. Даль. 1880-1882 гг. более 200 тыс. слов
або АБО, альбо союз ряз., кур., вор. ли, либо, или. Або добыть, або домой (домовь, дома) не быть, зап.; || аль, разве, нежто. Або то, або это, либо. Або ты не слышишь? Або-ще, вот еще, что еще, как бы не так; будто? Або-що, что-нибудь; || хотя и. Дай або-що, что-нибудь. Або-що батька, да хуже свекра, хотя. Або-как, как-нибудь, как попало.

:read:

Iska 20-04-2019 23:15 2868523

Цитата:

Цитата Busla
ха-ха-ха
нужно просто запомнить текущую позицию - в принципе все файлы - двоичные »

Перечитайте, пожалуйста, на что я отвечал.

Цитата:

Цитата Busla
нет такого слова (в русском языке) »

В Вашем русском языке, может быть, и нет. В моём — есть.


Цитата:

Цитата Busla
нужно просто повторить операции »

…и потерять непрочитанные записи.

Busla 20-04-2019 23:44 2868525

mwz, ok - в современном русском языке

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

Цитата:

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

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


Время: 10:48.

Время: 10:48.
© OSzone.net 2001-