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

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

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

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

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

Реалізація: Знайшов декілька прикладів, взяв за основу цей: http://2lx.ru/2010/02/chtenie-i-zapis-i … -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);
             }

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

"Most good programmers do programming not because they expect to get paid or get adulation by the public, but because it is fun to program."
- Linus Torvalds

2

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

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

I belong to the Dead Generation.

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

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

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

Говорила баба діду: «Я поїду к Білодіду, Ізучу двомовну мову І вернусь обратно знову». А дід бабі: «Не *изди, К Білодіду нєт їзди, — Туди не ходять поїзди»

4

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

Bartash написав:

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

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

"Most good programmers do programming not because they expect to get paid or get adulation by the public, but because it is fun to program."
- Linus Torvalds

5

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

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

Говорила баба діду: «Я поїду к Білодіду, Ізучу двомовну мову І вернусь обратно знову». А дід бабі: «Не *изди, К Білодіду нєт їзди, — Туди не ходять поїзди»

6

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

0xDADA11C7 написав:

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

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

"Most good programmers do programming not because they expect to get paid or get adulation by the public, but because it is fun to program."
- Linus Torvalds

7 Востаннє редагувалося koala (03.05.2014 07: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());
Maybe a = Just a | Nothing

9 Востаннє редагувалося Logans (03.05.2014 13: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). Зробив я це, але в результаті нічого нового не сталося, значення так і не записалось.

"Most good programmers do programming not because they expect to get paid or get adulation by the public, but because it is fun to program."
- Linus Torvalds

10 Востаннє редагувалося koala (03.05.2014 14: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 14: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.

"Most good programmers do programming not because they expect to get paid or get adulation by the public, but because it is fun to program."
- Linus Torvalds
Подякували: koala1

12

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

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

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

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

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

koala написав:

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

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

"Most good programmers do programming not because they expect to get paid or get adulation by the public, but because it is fun to program."
- Linus Torvalds

14

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

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