Ошибка создания записи в ini файле
Проблема состоит в следующем:
при записи в ini файл integer'a (если быть точным, то TColor'a) командой writeinteger, компилятор выдает access violation error. В хелпе говорится, что это типа что-то с памятью, с доступом к ней. Я чего-то плохо понимаю это дело. В чем может быть ошибка?
Заранее благодарен.
Originally posted by Peter F. [b]при записи в ini файл integer'a (если быть точным, то TColor'a) командой writeinteger, компилятор выдает access violation error. |
При закрытии второй формы программы (форма опций) настройки должны забрасываться в файл. Потом, при создании главной формы (при загрузке программы), эти настройки должны загружаться из этого файла.
Текст ошибки:
Access violation at address 00486E01 in module 'Project1.exe'/ Read of address 000005CC |
Пропусти программу пошагово и посмотри при исполнении какой точно операции комп выдаёт ошибку. |
При исполнении этих процедур ошибки не выдает. А вот после - что-то вроде Module 'project1.exe' raised too many consecutive exceptions "Access Violation. ", а дальше длинный код ошибки.
Ерунда какая-то. Причем, при запуске этих же процедур при закрытии главной формы все работает.
Гы. Прикол в том, что TColor и Integer это два несовместимых типа.
На самом деле нужно сначала перетоптать TColor в String и только потом писать в файл. читать наоборот.
Для этого существуют 2 функции:
uses
.
IniFiles;
.
var
Ini: TIniFile;
C: TColor;
.
Ini:= TIniFile.Create('MyINI.ini');
Ini.WriteString('program','mycolor',ColorToString(C));
C:= StringToColor(Ini.ReadString('program','mycolor',''));
Ini.Free;
.
А зачем вызывается метод Free?
Я не знаю, как именно в Дельфи, но в Билдере этот метод рзарушает объект
Вобщем народ проблема на лицо! при нажатии на кнопку должно записать определенное значение в ИНИ. Но гадина при первом запуске записывает, а в других случаях выдает ошибку(Unable to write to setting/setting.ini). При указании полного пути к файлу все ОК. Что блин за маразм! Вроде ведь все просто сделано.
Помогите чем сможете!
Вот код:
Ошибка при записи в файл
Здравствуйте! Пишу программу для записи для теста. Возникла ошибка I/O error 6. Смотрел в интернете.
Возникает ошибка при записи в файл Excel
При написания кода в Delphi ( приведенного ниже) компиляция происходит нормально, без ошибок. Но.
Вопрос по таймеру и ошибка при записи информации в файл
Всем привет! Пишу игру на Delphi XE8! Но не выходит! В таймере когда программа поняла что sec = 0.
Это путь относительно текущей директории.
Судя по форме записи пути ты ожидаешь что текущей всегда будет являться не иначе как директория, где расположен исп.файл приложения, что в ряде случаев может не соответствовать действительности.
Добавлено через 5 минут
О, уже в другую сторону оглобли завернул)
Только что было про "неполный путь", а теперь, оказывается, анейбл ту райт..
Это ж две разные разницы !
Анейбл ту райт не имеет ничего общено с предыдущим описанием ошибки - проблема ведет к правам на доступ к файлу (или директории где он расположен или должен быть создан) по записи.
программу от имени администратора запускай все будет ОК.
Добавлено через 32 секунды
Unable to write to setting/setting.ini - запрещено записывать в файл
Ты бы английский подучил. Там нет слова "запрещено", там есть констатация факта: не могу записать в setting/setting.ini.
Не будет. Это плохая программа, если ее надо запускать под администратором, чтобы она смогла записать Ini-файл. К тому же,
, то есть, я правильно понимаю твою логику, kaspersky, что при указании полного пути программа сама запускается от имени администратора?
Ты бы английский подучил. Там нет слова "запрещено", там есть констатация факта: не могу записать в setting/setting.ini.
Не будет. Это плохая программа, если ее надо запускать под администратором, чтобы она смогла записать Ini-файл. К тому же,
, то есть, я правильно понимаю твою логику, kaspersky, что при указании полного пути программа сама запускается от имени администратора?
Вот и указывай полный путь, ExtractFilePath(Application.Exename) не просто так придумали.
_________________________________________________
Ну я не писал что "при указании полного пути программа сама запускается от имени администратора?" - где ты это прочитал ??
____________________________________
а то что с английским плохо, то я не переводил а написал что типо программе запрещено запись в файл (т.е. запись в системном диски- надеюсь понял мою мысль)
Добавлено через 6 минут
а как еще ? если файл конфигов в папке с программой в системном диске лежит ?. можно конечно настройки сохранять в папку c:\Users\<имя пользователя>\AppData\бла-бла-бла.имя>
Все бы ничего но мне нужно указать путь именно так.
Как тогда программно написать разрешения для файла на запись.
Вся разработка программы встала из за этого непонятного бреда.
Как быть то?
Добавлено через 41 минуту
Всем огромное спасибо, что откликнулись!
Проблему уничтожил!
Вот так:
Строка в скобках задает положение и имя файла инициализации.
Иначе файл будет сохранен в системном каталоге Windows.
Репутация: нет
Всего: нет
Всем добрый день!
Есть 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
Код |
void __fastcall TMultiHead::SaveProgram() TIniFile *ProgFile = new TIniFile(FullPathPrograms + ProgramName); AnsiString Str = "ProgramStatus"; ProgFile->WriteBool(Str, "Protected", ProtectedProgram); |
// много всяких параметров
Пути к директориям FullPathPrograms и FullPathStatistic задаются при запуске программы и впоследствии не меняются.
Вижу следующие пути решения проблемы, которые могут устранить возникновение этой ошибки, но могут и не устранить:
* Файл stat_out открывать и не закрывать. Таким образом, устранится возможность использования stat_out при открытии INI-файла.
* Запись байтами (53 байта), а не текстом (262 байта).
* Записывать в stat_out сразу одним буфером.
* Обработка ошибок. ferror.
Написал программу только с аналогичными функциями, запустил на материнке - ошибок не возникало, при этом она работала несколько часов гораздо активнее, нежели тестируемая программа.
Кто-нибудь сталкивался с такой проблемой?
Репутация: 167
Всего: 306
Код |
TIniFile *ProgFile = new TIniFile(FullPathPrograms + ProgramName); |
что в данном случае ProgramName?
Добавлено через 3 минуты и 26 секунд
я бы сделал так:
Код |
TIniFile *ProgFile = new TIniFile(ExtractFilePath(Application->ExeName) + "inifile.ini"); |
Добавлено через 5 минут и 45 секунд
да и не стоит забывать что ini-файл уже должен быть - то есть сам он не создастся при вызове конструктора
Репутация: нет
Всего: нет
Цитата(mrbrooks @ 15.12.2008, 10:30) |
NuShaman, мне не нравится это строчка |
Код |
TIniFile *ProgFile = new TIniFile(FullPathPrograms + ProgramName); |
ProgramName - это название файла программы, оно одно и то же в обоих функциях, но поскольку пути к директориям FullPathPrograms и FullPathStatistic разные и не меняются, то возможен лишь какой-то сбой в памяти при использовании этих переменных, из-за чего записывая в один файл, информация попала в другой.
Репутация: 167
Всего: 306
Цитата(NuShaman @ 15.12.2008, 10:37 ) |
ProgramName - это название файла программы, оно одно и то же в обоих функциях, но поскольку пути к директориям FullPathPrograms и FullPathStatistic разные и не меняются, то возможен лишь какой-то сбой в памяти при использовании этих переменных, из-за чего записывая в один файл, информация попала в другой. |
Репутация: нет
Всего: нет
Цитата(mrbrooks @ 15.12.2008, 10:40) |
а где же имя файла? посмотри мой предыдущий пост. |
ProgramName - переменная типа AnsiString, может содержать, например, "123456.mhp" или "asrgaerhasertnwrt.mhp", вообщем любое название с расширением MHP.
INI-файл уже создан.
Репутация: 1
Всего: 36
NuShaman,
эти функции пишут в один файл или в разные?
что вот это такое я вообще не понял: "содержимое INI-файла прописалось в файл, открытый fopen.txt"
Репутация: нет
Всего: нет
Цитата(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 |
Репутация: нет
Всего: нет
Решение такое:
Использую компонент TFileStream и записываю одним буфером в 56 байт (числа в цифровом, а не в текстовом виде).
Всех с наступившим 2009 годом! Любви и успехов!
Запрещается!
1. Публиковать ссылки на вскрытые компоненты
2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
- Литературу по С++ Builder обсуждаем здесь
- Действия модераторов можно обсудить здесь
- С просьбами о написании курсовой, реферата и т.п. обращаться сюда
- Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи
- FAQ раздела лежит здесь!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader.
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C++ Builder | Следующая тема » |
[ Время генерации скрипта: 0.1280 ] [ Использовано запросов: 21 ] [ GZIP включён ]
Репутация: нет
Всего: нет
Всем добрый день!
Есть 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
Код |
void __fastcall TMultiHead::SaveProgram() TIniFile *ProgFile = new TIniFile(FullPathPrograms + ProgramName); AnsiString Str = "ProgramStatus"; ProgFile->WriteBool(Str, "Protected", ProtectedProgram); |
// много всяких параметров
Пути к директориям FullPathPrograms и FullPathStatistic задаются при запуске программы и впоследствии не меняются.
Вижу следующие пути решения проблемы, которые могут устранить возникновение этой ошибки, но могут и не устранить:
* Файл stat_out открывать и не закрывать. Таким образом, устранится возможность использования stat_out при открытии INI-файла.
* Запись байтами (53 байта), а не текстом (262 байта).
* Записывать в stat_out сразу одним буфером.
* Обработка ошибок. ferror.
Написал программу только с аналогичными функциями, запустил на материнке - ошибок не возникало, при этом она работала несколько часов гораздо активнее, нежели тестируемая программа.
Кто-нибудь сталкивался с такой проблемой?
Репутация: 167
Всего: 306
Код |
TIniFile *ProgFile = new TIniFile(FullPathPrograms + ProgramName); |
что в данном случае ProgramName?
Добавлено через 3 минуты и 26 секунд
я бы сделал так:
Код |
TIniFile *ProgFile = new TIniFile(ExtractFilePath(Application->ExeName) + "inifile.ini"); |
Добавлено через 5 минут и 45 секунд
да и не стоит забывать что ini-файл уже должен быть - то есть сам он не создастся при вызове конструктора
Репутация: нет
Всего: нет
Цитата(mrbrooks @ 15.12.2008, 10:30) |
NuShaman, мне не нравится это строчка |
Код |
TIniFile *ProgFile = new TIniFile(FullPathPrograms + ProgramName); |
ProgramName - это название файла программы, оно одно и то же в обоих функциях, но поскольку пути к директориям FullPathPrograms и FullPathStatistic разные и не меняются, то возможен лишь какой-то сбой в памяти при использовании этих переменных, из-за чего записывая в один файл, информация попала в другой.
Репутация: 167
Всего: 306
Цитата(NuShaman @ 15.12.2008, 10:37 ) |
ProgramName - это название файла программы, оно одно и то же в обоих функциях, но поскольку пути к директориям FullPathPrograms и FullPathStatistic разные и не меняются, то возможен лишь какой-то сбой в памяти при использовании этих переменных, из-за чего записывая в один файл, информация попала в другой. |
Репутация: нет
Всего: нет
Цитата(mrbrooks @ 15.12.2008, 10:40) |
а где же имя файла? посмотри мой предыдущий пост. |
ProgramName - переменная типа AnsiString, может содержать, например, "123456.mhp" или "asrgaerhasertnwrt.mhp", вообщем любое название с расширением MHP.
INI-файл уже создан.
Репутация: 1
Всего: 36
NuShaman,
эти функции пишут в один файл или в разные?
что вот это такое я вообще не понял: "содержимое INI-файла прописалось в файл, открытый fopen.txt"
Репутация: нет
Всего: нет
Цитата(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 |
Репутация: нет
Всего: нет
Решение такое:
Использую компонент TFileStream и записываю одним буфером в 56 байт (числа в цифровом, а не в текстовом виде).
Всех с наступившим 2009 годом! Любви и успехов!
Запрещается!
1. Публиковать ссылки на вскрытые компоненты
2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
- Литературу по С++ Builder обсуждаем здесь
- Действия модераторов можно обсудить здесь
- С просьбами о написании курсовой, реферата и т.п. обращаться сюда
- Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи
- FAQ раздела лежит здесь!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader.
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C++ Builder | Следующая тема » |
[ Время генерации скрипта: 0.1329 ] [ Использовано запросов: 21 ] [ GZIP включён ]
Репутация: нет
Всего: нет
Всем добрый день!
Есть 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
Код |
void __fastcall TMultiHead::SaveProgram() TIniFile *ProgFile = new TIniFile(FullPathPrograms + ProgramName); AnsiString Str = "ProgramStatus"; ProgFile->WriteBool(Str, "Protected", ProtectedProgram); |
// много всяких параметров
Пути к директориям FullPathPrograms и FullPathStatistic задаются при запуске программы и впоследствии не меняются.
Вижу следующие пути решения проблемы, которые могут устранить возникновение этой ошибки, но могут и не устранить:
* Файл stat_out открывать и не закрывать. Таким образом, устранится возможность использования stat_out при открытии INI-файла.
* Запись байтами (53 байта), а не текстом (262 байта).
* Записывать в stat_out сразу одним буфером.
* Обработка ошибок. ferror.
Написал программу только с аналогичными функциями, запустил на материнке - ошибок не возникало, при этом она работала несколько часов гораздо активнее, нежели тестируемая программа.
Кто-нибудь сталкивался с такой проблемой?
Репутация: 167
Всего: 306
Код |
TIniFile *ProgFile = new TIniFile(FullPathPrograms + ProgramName); |
что в данном случае ProgramName?
Добавлено через 3 минуты и 26 секунд
я бы сделал так:
Код |
TIniFile *ProgFile = new TIniFile(ExtractFilePath(Application->ExeName) + "inifile.ini"); |
Добавлено через 5 минут и 45 секунд
да и не стоит забывать что ini-файл уже должен быть - то есть сам он не создастся при вызове конструктора
Репутация: нет
Всего: нет
Цитата(mrbrooks @ 15.12.2008, 10:30) |
NuShaman, мне не нравится это строчка |
Код |
TIniFile *ProgFile = new TIniFile(FullPathPrograms + ProgramName); |
ProgramName - это название файла программы, оно одно и то же в обоих функциях, но поскольку пути к директориям FullPathPrograms и FullPathStatistic разные и не меняются, то возможен лишь какой-то сбой в памяти при использовании этих переменных, из-за чего записывая в один файл, информация попала в другой.
Репутация: 167
Всего: 306
Цитата(NuShaman @ 15.12.2008, 10:37 ) |
ProgramName - это название файла программы, оно одно и то же в обоих функциях, но поскольку пути к директориям FullPathPrograms и FullPathStatistic разные и не меняются, то возможен лишь какой-то сбой в памяти при использовании этих переменных, из-за чего записывая в один файл, информация попала в другой. |
Репутация: нет
Всего: нет
Цитата(mrbrooks @ 15.12.2008, 10:40) |
а где же имя файла? посмотри мой предыдущий пост. |
ProgramName - переменная типа AnsiString, может содержать, например, "123456.mhp" или "asrgaerhasertnwrt.mhp", вообщем любое название с расширением MHP.
INI-файл уже создан.
Репутация: 1
Всего: 36
NuShaman,
эти функции пишут в один файл или в разные?
что вот это такое я вообще не понял: "содержимое INI-файла прописалось в файл, открытый fopen.txt"
Репутация: нет
Всего: нет
Цитата(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 |
Репутация: нет
Всего: нет
Решение такое:
Использую компонент TFileStream и записываю одним буфером в 56 байт (числа в цифровом, а не в текстовом виде).
Всех с наступившим 2009 годом! Любви и успехов!
Запрещается!
1. Публиковать ссылки на вскрытые компоненты
2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
- Литературу по С++ Builder обсуждаем здесь
- Действия модераторов можно обсудить здесь
- С просьбами о написании курсовой, реферата и т.п. обращаться сюда
- Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи
- FAQ раздела лежит здесь!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader.
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C++ Builder | Следующая тема » |
[ Время генерации скрипта: 0.1268 ] [ Использовано запросов: 21 ] [ GZIP включён ]
Читайте также: