Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Ошибка записи: запись INI-файла в другой файл 
:(
    Опции темы
NuShaman
Дата 15.12.2008, 10:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 18.6.2008
Где: Екатеринбург

Репутация: нет
Всего: нет



Всем добрый день!
Есть 2 функции, первая периодически записывает в трэде в текстовый файл, вторая - по нажатию кнопки оператором сохраняет параметры в INI-файл.
Был замечен случай ошибки в записи, когда содержимое INI-файла прописалось в файл, открытый fopen.txt.
После чего идут несколько нулевых байт, потом идут FF по адресам E800-EFFF и 00 по адресам F000-2EE48.

Программа выполняется на промышленной материнке под Windows 98, на образе DRVSPACE.000, загруженному в оперативную память. Объём ОЗУ = 256 Мб.
Привожу сокращенный код этих функций.

Код

void __fastcall TMultiHead::StatSave()
{
 char path[200];
 strcpy(path, "");
 strcat(path, FullPathStatistic.c_str());
 strcat(path, ProgramName.c_str());

 stat_out = fopen(path, "a+t");
 fprintf(stat_out, " %02d\n", stat_operation);

// много всяких fprintf

 fclose(stat_out);

 int Handle = FileOpen(FullPathStatistic + ProgramName, fmOpenReadWrite);
 FileSetDate(Handle, Now().FileDate());
 FileClose(Handle);
}


Код

void __fastcall TMultiHead::SaveProgram()
{
 TIniFile *ProgFile = new TIniFile(FullPathPrograms + ProgramName);
 AnsiString Str = "ProgramStatus";
 ProgFile->WriteBool(Str, "Protected", ProtectedProgram);

// много всяких параметров

 WritePrivateProfileString(0, 0, 0, (FullPathPrograms + ProgramName).c_str());
 delete ProgFile;
}


Пути к директориям FullPathPrograms и FullPathStatistic задаются при запуске программы и впоследствии не меняются.
Вижу следующие пути решения проблемы, которые могут устранить возникновение этой ошибки, но могут и не устранить:
 * Файл stat_out открывать и не закрывать. Таким образом, устранится возможность использования stat_out при открытии INI-файла.
 * Запись байтами (53 байта), а не текстом (262 байта).
 * Записывать в stat_out сразу одним буфером.
 * Обработка ошибок. ferror.
Написал программу только с аналогичными функциями, запустил на материнке - ошибок не возникало, при этом она работала несколько часов гораздо активнее, нежели тестируемая программа.
Кто-нибудь сталкивался с такой проблемой?

PM MAIL WWW ICQ Skype   Вверх
mrbrooks
Дата 15.12.2008, 10:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


трололомен
****


Профиль
Группа: Завсегдатай
Сообщений: 4259
Регистрация: 4.10.2006
Где: Дол Гулдур

Репутация: 167
Всего: 306



NuShaman
мне не нравится это строчка 
Код

TIniFile *ProgFile = new TIniFile(FullPathPrograms + ProgramName);

что в данном случае ProgramName?

Добавлено через 3 минуты и 26 секунд
я бы сделал так:
Код

TIniFile *ProgFile = new TIniFile(ExtractFilePath(Application->ExeName) + "inifile.ini");


Добавлено через 5 минут и 45 секунд
да и не стоит забывать что ini-файл уже должен быть - то есть сам он не создастся при вызове конструктора
PM MAIL   Вверх
NuShaman
Дата 15.12.2008, 10:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 18.6.2008
Где: Екатеринбург

Репутация: нет
Всего: нет



Цитата(mrbrooks @ 15.12.2008,  10:30)
NuShaman
мне не нравится это строчка 
Код

TIniFile *ProgFile = new TIniFile(FullPathPrograms + ProgramName);

что в данном случае ProgramName?

ProgramName - это название файла программы, оно одно и то же в обоих функциях, но поскольку пути к директориям FullPathPrograms и FullPathStatistic разные и не меняются, то возможен лишь какой-то сбой в памяти при использовании этих переменных, из-за чего записывая в один файл, информация попала в другой.
PM MAIL WWW ICQ Skype   Вверх
mrbrooks
Дата 15.12.2008, 10:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


трололомен
****


Профиль
Группа: Завсегдатай
Сообщений: 4259
Регистрация: 4.10.2006
Где: Дол Гулдур

Репутация: 167
Всего: 306



Цитата(NuShaman @  15.12.2008,  10:37 Найти цитируемый пост)
ProgramName - это название файла программы, оно одно и то же в обоих функциях, но поскольку пути к директориям FullPathPrograms и FullPathStatistic разные и не меняются, то возможен лишь какой-то сбой в памяти при использовании этих переменных, из-за чего записывая в один файл, информация попала в другой. 

а где же имя файла? посмотри мой предыдущий пост.
PM MAIL   Вверх
NuShaman
Дата 15.12.2008, 10:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 18.6.2008
Где: Екатеринбург

Репутация: нет
Всего: нет



Цитата(mrbrooks @ 15.12.2008,  10:40)
а где же имя файла? посмотри мой предыдущий пост.

ProgramName - переменная типа AnsiString, может содержать, например, "123456.mhp" или "asrgaerhasertnwrt.mhp", вообщем любое название с расширением MHP.

INI-файл уже создан.
PM MAIL WWW ICQ Skype   Вверх
Rififi
Дата 15.12.2008, 12:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1254
Регистрация: 9.3.2008

Репутация: 1
Всего: 36



NuShaman
эти функции пишут в один файл или в разные?
что вот это такое я вообще не понял: "содержимое INI-файла прописалось в файл, открытый fopen.txt"
PM MAIL   Вверх
NuShaman
Дата 15.12.2008, 12:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 18.6.2008
Где: Екатеринбург

Репутация: нет
Всего: нет



Цитата(Rififi @ 15.12.2008,  12:17)
NuShaman
эти функции пишут в один файл или в разные?
что вот это такое я вообще не понял: "содержимое INI-файла прописалось в файл, открытый fopen.txt"

Обе функции пишут в разные файлы (Название у этих двух файлов одно и то же, но в разных папках: FullPathPrograms и FullPathStatistic).
В приложении также используется COM-порт, много объёмных TImage, очень много переменных и массивов, что якобы может привести к сбою в памяти.

Добавлено через 6 минут и 1 секунду
Вот фрагмент, когда содержимое INI-файла прописалось в файл статистики.

Код

23.09 04:35:04 02
 200.0  +10.0 / -10.0
    0.8
 199.4
       4
     0
     0
     0
     0
     1
     3
     0
     0
     0
     0
     0

[ProgramStatus]
Protected=0

[TargetCondition]
Speed=60
DoubleUnload=1
Unload_Kol=1
PacketWeight=5000
DeltaPlus=150
DeltaMinus=150

[OtherCondition]
PackMachine=1
PackMachine2=0
AddLevel=18

........................

[ProgramStatistic]
TotalWeight=10880729
PacketsCounter=2177
PacketsPerMinute=0
0=21
1=47
2=89
3=140
4=298
5=1065
6=245
7=130
8=81
9=27
10=29

26.09 02:47:48 08
 200.0  +10.0 / -10.0
    0.0
   0.0
       0
     0
     0
     0
     0
     0
     0
     0
     0
     0
     0
     0

26.09 02:49:51 00
 200.0  +10.0 / -10.0
    0.0
   0.0
       0
     0
     0
     0
     0
     0
     0
     0
     0
     0
     0
     0


PM MAIL WWW ICQ Skype   Вверх
NuShaman
Дата 16.1.2009, 07:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 18.6.2008
Где: Екатеринбург

Репутация: нет
Всего: нет



Решение такое:
Использую компонент TFileStream и записываю одним буфером в 56 байт (числа в цифровом, а не в текстовом виде).
Всех с наступившим 2009 годом! Любви и успехов!
PM MAIL WWW ICQ Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C++ Builder | Следующая тема »


 




[ Время генерации скрипта: 0.1213 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.