1 Востаннє редагувалося Logans (02.05.2014 22:22:36)

Тема: Запис та зчитування даних *.ini файлу

Добрий вечір.

Завдання: Створити програму, яка повинна пам'ятати розмір та положення вікна, а також вміст поля введення та перемикача.

Пояснення: Тобто форма, на якій розміщений textBox та checkBox. Записувати в *.ini файл this->width/this->height/textBox->Text/checkBox->Checked та відповідно зчитувати.

Реалізація: Знайшов декілька прикладів, взяв за основу цей: http://2lx.ru/2010/02/chtenie-i-zapis-ini-fajlov-v-visual-c/ . Створив біля *.exe-файлу (проекта) та біля *.h-головної форми файли simple.ini

Зміст цих файлів
[Form_Settings]
Width =  ;
// Це типу закоментовані рядки
;Height =  ;
;TextBox_Text = ;
;CheckBox_Checked =  ;
;Position =  ; 

Далі намагаюсь записати ширину форми в поданий файл.

Код запису в *.ini файл
    /*Переведення з System::String^ в std::string*/
    private: std::string sysStringToStdString(System::String^ systemString) {
                 std::string newString = msclr :: interop :: marshal_as <std::string> (systemString);
                 return newString;
             }
    /*Функція запису в *.ini файл*/
    private: bool WriteToIni(char *filename, char *section, char *key, char* data) {
                 return WritePrivateProfileString((LPCWSTR)section, (LPCWSTR)key, (LPCWSTR)data, (LPCWSTR)filename);
             }

    private: System::Void button1_Click(System::Object^  sender, System::EventArgs^  e) {
                 // Ширина поля переведена з int в string                 
                 string FormWidht = sysStringToStdString(this -> Width.ToString());
                 // та в char*                 
                 char* CharValue = new char[FormWidht.size() + 1]; 
                 WriteToIni("simple.ini", "Form_Settings", "Width", CharValue);
             }

Проблема: Як ви вже зрозуміли, проблема в тому, що в файл нічого не записується. Помилок при компіляції не вибиває.

2

Re: Запис та зчитування даних *.ini файлу

А чим стандартні *fstream не підійшли?

3 Востаннє редагувалося 0xDADA11C7 (02.05.2014 23:44:08)

Re: Запис та зчитування даних *.ini файлу

користуйтесь JSON`ом - parson бібіліотека вам у руки. Я її у чистих сях використовую.

4

Re: Запис та зчитування даних *.ini файлу

Bartash написав:

А чим стандартні *fstream не підійшли?

Можливо і підійдуть, але це більше вже як альтернатива. Все-ж-таки хочеться дізнатися як працювати з ini файли через створені для цього функції.

5

Re: Запис та зчитування даних *.ini файлу

Фукнції для роботи з іні файлами у вінді вже років 15 як deprecated, альтернатива - реєстр.

6

Re: Запис та зчитування даних *.ini файлу

0xDADA11C7 написав:

Фукнції для роботи з іні файлами у вінді вже років 15 як deprecated, альтернатива - реєстр.

Для реєстру в мене буду інша лаба)

7 Востаннє редагувалося koala (03.05.2014 06:19:28)

Re: Запис та зчитування даних *.ini файлу

button1_Click не зберігає рядок у виділену пам'ять (і що гірше - не звільняє пам'ять після запису).

8

Re: Запис та зчитування даних *.ini файлу

Як сказав koala ти не скопіював FormWidht в CharValue.
Але тут можна обійтись взагалі без CharValue так як в std::string є метод для отримання char*

Тож спробуй отак

WriteToIni("simple.ini", "Form_Settings", "Width", FormWidht.c_str());

9 Востаннє редагувалося Logans (03.05.2014 12:40:21)

Re: Запис та зчитування даних *.ini файлу

0x9111A написав:

Як сказав koala ти не скопіював FormWidht в CharValue.
Але тут можна обійтись взагалі без CharValue так як в std::string є метод для отримання char*

Тож спробуй отак

WriteToIni("simple.ini", "Form_Settings", "Width", FormWidht.c_str());

Ну взагалі .c_str() переводить в const char* (як каже VS2010). Зробив я це, але в результаті нічого нового не сталося, значення так і не записалось.

10 Востаннє редагувалося koala (03.05.2014 13:18:14)

Re: Запис та зчитування даних *.ini файлу

Тоді, будь ласка,
1. Спробуйте писати в файл, якого ще не існує. Він створився? Можливо, крапки з комами некоректно обробляються.
2. Обробляйте помилки:

bool writtenGood = WriteToIni("simple.ini", "Form_Settings", "Width", FormWidht.c_str());
if( !writtenGood )
{
  printf( "Writing INI failed with 0x%x\n", GetLastError() );
}

Код шукайте на MSDN (або навіть виводьте одразу текст помилки)

11 Востаннє редагувалося Logans (03.05.2014 13:37:48)

Re: Запис та зчитування даних *.ini файлу

koala написав:

Тоді, будь ласка,
1. Спробуйте писати в файл, якого ще не існує. Він створився? Можливо, крапки з комами некоректно обробляються.
2. Обробляйте помилки:

bool writtenGood = WriteToIni("simple.ini", "Form_Settings", "Width", FormWidht.c_str());
if( !writtenGood )
{
  printf( "Writing INI failed with 0x%x\n", GetLastError() );
}

Код шукайте на MSDN (або навіть виводьте одразу текст помилки)

1. Спробував, не створився.
2. Обробив, але умова не виконалась, writtenGood = true.

Подякували: koala1

12

Re: Запис та зчитування даних *.ini файлу

В такому разі... хм... або програма запускається не з того каталогу, або ця функція вже чомусь не підтримується в такій формі (наприклад, через кодування символів) і, щоб її використати, треба докласти зусилля, цілком співставні з парсингом ini-файлу руками.

Подякували: Logans1

13 Востаннє редагувалося Logans (03.05.2014 17:36:08)

Re: Запис та зчитування даних *.ini файлу

koala написав:

В такому разі... хм... або програма запускається не з того каталогу, або ця функція вже чомусь не підтримується в такій формі (наприклад, через кодування символів) і, щоб її використати, треба докласти зусилля, цілком співставні з парсингом ini-файлу руками.

Тобто краще вже зробити в Delphi, або в Borland C++ (вимог до мови написання та середовища немає).

14

Re: Запис та зчитування даних *.ini файлу

Так, TIniFile працює.