C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
Как считать данные из ini в переменную?
creater
  Отправлено: 26.10.2003, 10:02


Станционный диспетчер

Группа: Участник
Сообщений: 120



AnsiString info;

IniFile *ini;
ini = new TIniFile( ChangeFileExt( Application->ExeName, ".INI" ) );
ini->ReadString( "section", "name", info);
delete ini;

ShowMessage(info); отображается пустота...
Nick
Отправлено: 26.10.2003, 10:22


Машинист паровоза

Группа: Участник
Сообщений: 247



Считать нужно как я понял в info

info = ini->ReadString( "section", "name", "нет данных" );

3-ий параметр это значение по умолчанию если в ini нет
секции section и параметра name info присваивается "нет данных".
Георгий
Отправлено: 26.10.2003, 10:29


Почетный железнодорожник

Группа: Модератор
Сообщений: 874



QUOTE
ini->ReadString( "section", "name", info);

Последний аргумент предназначени для задания значения "по умолчанию" т.е. на тот случай, когда или в секции, или значении, или в имени поля находится нечно невразумительное.
А значение, считанное из поля возвращается функцией т.е. нужно так:
CODE
info=ini->ReadString( "section", "name", info)


интересно, а перевод на зимнее время здесь бывает? smile.gif
Nick — быстрее меня печатаешь!


Отредактировано Георгий — 26/10/2003, 11:32
creater
Отправлено: 26.10.2003, 11:41


Станционный диспетчер

Группа: Участник
Сообщений: 120



QUOTE (Георгий @ 26/10/2003, 11:31)
А значение, считанное из поля возвращается функцией т.е. нужно так:
CODE
info=ini->ReadString( "section", "name", info)

так у меня было с самого начала... и пусто
Георгий
Отправлено: 26.10.2003, 11:58


Почетный железнодорожник

Группа: Модератор
Сообщений: 874



сразу не заметил:
QUOTE
ini = new TIniFile( ChangeFileExt( Application->ExeName, ".INI" ) );

А зачем переименовывать загружаемый модуль твоей программы?

Может надо получить такоже имя, что у нашего exe`шника, но с расширением ini? Тогда можно так:
CODE
AnsiString info;
AnsiString ext=ExtractFileExt(Application->ExeName);
AnsiString fn=Application->ExeName.SubString(1,Application->ExeName.Length()-ext.Length());
fn+=".ini";
а потом
CODE

TIniFile *ini;
ini = new TIniFile( fn );
info=ini->ReadString( "section", "name", info);
delete ini;
creater
Отправлено: 26.10.2003, 13:25


Станционный диспетчер

Группа: Участник
Сообщений: 120



QUOTE (Георгий @ 26/10/2003, 13:00)
Может надо получить такоже имя, что у нашего exe`шника, но с расширением ini? Тогда можно так:
CODE
AnsiString info;
AnsiString ext=ExtractFileExt(Application->ExeName);
AnsiString fn=Application->ExeName.SubString(1,Application->ExeName.Length()-ext.Length());
fn+=".ini";
а потом
CODE

TIniFile *ini;
ini = new TIniFile( fn );
info=ini->ReadString( "section", "name", info);
delete ini;

QUOTE

сразу не заметил:
ini = new TIniFile( ChangeFileExt( Application->ExeName, ".INI" ) );
А зачем переименовывать загружаемый модуль твоей программы?

Да, тут Я глюканул.

Есть файл file.ini, который создается одной программой. И есть другая программа которая работает с file.ini.

Т.е. нужно обратиться к file.ini и из section, считать данные поля name в переменную info
creater
Отправлено: 26.10.2003, 14:47


Станционный диспетчер

Группа: Участник
Сообщений: 120



QUOTE (Георгий @ 26/10/2003, 13:00)
Может надо получить такоже имя, что у нашего exe`шника, но с расширением ini? Тогда можно так:
CODE
AnsiString info;
AnsiString ext=ExtractFileExt(Application->ExeName);
AnsiString fn=Application->ExeName.SubString(1,Application->ExeName.Length()-ext.Length());
fn+=".ini";
а потом
CODE

TIniFile *ini;
ini = new TIniFile( fn );
info=ini->ReadString( "section", "name", info);
delete ini;

Так как же из ини файла считать инфу?

Делаю так:
TIniFile *ini;
ini = new TIniFile("file.ini");
info = ini->ReadString( "section", "name", info);

В info пусто. :-(
Admin
Отправлено: 26.10.2003, 15:15


Владимир

Группа: Администратор
Сообщений: 1190



CODE

void __fastcall TForm1::Button1Click(TObject *Sender)
{
AnsiString info = "ABCDEFGH";

TIniFile *ini = new TIniFile("C:\\Program Files\\Borland\\CBuilder6\\Projects\\pr_ini\\file.ini");
ini->WriteString( "section", "name", info);

AnsiString info2 = ini->ReadString( "section", "name", "No Value");
ShowMessage(info2); // получаем ABCDEFGH

delete ini; ini = NULL;
}


Попробуйте, вот так у меня все работает.

Может как-то неправильно указываете путь к ini-Файлу,
вот значение и не считывается ?
creater
Отправлено: 26.10.2003, 15:56


Станционный диспетчер

Группа: Участник
Сообщений: 120



QUOTE (Admin @ 26/10/2003, 16:17)
CODE

void __fastcall TForm1::Button1Click(TObject *Sender)
{
AnsiString info = "ABCDEFGH";

TIniFile *ini = new TIniFile("C:\\Program Files\\Borland\\CBuilder6\\Projects\\pr_ini\\file.ini");
ini->WriteString( "section", "name", info);

AnsiString info2 = ini->ReadString( "section", "name", "No Value");
ShowMessage(info2); // получаем ABCDEFGH

delete ini; ini = NULL;
}


Попробуйте, вот так у меня все работает.

Может как-то неправильно указываете путь к ini-Файлу,
вот значение и не считывается ?

Спасибо, заработало. Дело на самом деле в путях.
Только вот еще хотел спросить.
Как указать чтобы file.ini читался из текущей дирректории, а не из каталога Windows smile.gif ?
Admin
Отправлено: 26.10.2003, 20:17


Владимир

Группа: Администратор
Сообщений: 1190



CODE

AnsiString sDir = GetCurrentDir();
TIniFile *ini = new TIniFile(sDir+"\\file.ini");
AnsiString info = ini->ReadString( "section", "name", "No Value");


Отредактировано Admin — 26/10/2003, 21:20

Вернуться в Вопросы программирования в C++Builder