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

 
Как прочитать из ini-файла несколько строк?, читается только первая строка :-(
Finder_adventures
  Отправлено: 28.04.2005, 08:36


Ученик-кочегар

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



Подскажите пожалуйста, как прочитать из ini-файла несколько строк
и выводить их , например, в Memo ?
Я делаю обычным способом -... Value1= Ini->ReadString(Section1, Ident1,""); ... При этом читается только первая строка :-(

Как мне целиком забрать всё что принадлежит этому "Иденту" после
знака "равно" Ident1=

[Options1]
Ident1= Валера
Вася тра-та-та
Петя там-тамтттт
Маруся и-и-иах





AVC
Отправлено: 28.04.2005, 09:23


Ветеран

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



ReadSection
ReadSections
и прочее по методам в help
Finder_adventures
Отправлено: 28.04.2005, 15:53


Ученик-кочегар

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



Что-то не получается ...
крутил и так и этак -
функции ( ReadSection и ReadSections) и ReadSectionValues

Теперь просто появилась возможность выводить и названия всех
секций и идентификаторов + опять значения в первых строках ...




AVC
Отправлено: 28.04.2005, 16:42


Ветеран

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



Дошло. Извините сначала не правильно понял вопрос. smile.gif
Если Value многострочный, то у меня получилось только руками или менять при записи символы новой строки на что то еще. А еще мне помнится, что длина строки в ini имеет ограничение.
Rius
Отправлено: 28.04.2005, 19:11


Мастер участка

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



Finder_adventures коли ищешь приключений на свою голову, попробуй формат XML, может полностью заменить ini.
AVC помниться под 98-й виндой какое-то ограничение встречал — толи строку в 1024 максимум символа, толи максимум 1024 строки...
а под WinXP все нормально.

User Attached Image Скачать файл
XML_Reader_2005.04.13___02.21.rar


Rius
Отправлено: 28.04.2005, 19:24


Мастер участка

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



Вот этот примерчик попроще будет:
чтение таблицы из XML текста и сохранение содержимого таблицы в XML
CODE
//---------------------------------------------------------------------------
void __fastcall TForm1::BSaveClick(TObject *Sender)
{
//Корневой элемент xml, создается новый
_di_IXMLNode MainNode = XMLDocument1->CreateNode(WideString("StringGrid"));
//и заменяет старый, чтобы удалить все предыдущие данные
XMLDocument1->DocumentElement = MainNode;
//Имеем: <StringGrid/>

//Записывается атрибут для хранения свойств этого нода (который "StringGrid")
//если атрибут не существует, он создается
MainNode->Attributes[WideString("cols")] = StringGrid1->ColCount;
MainNode->Attributes[WideString("rows")] = StringGrid1->RowCount;
//Имеем: <StringGrid cols="5" rows="5"></StringGrid>


//Перебор всех ячеек грида
for(int i=0; i<StringGrid1->ColCount; i++)
   for(int j=0; j<StringGrid1->RowCount; j++)
   {
       //создается нод для хранения ячейки "Cell" методом добавления к корневому
       //, точнее предыдущему, так как уровни вложенности вроде неограничены
       _di_IXMLNode ValueNode = MainNode->AddChild(WideString("Cell"));
       //Имеем: <Cell/>
       //Записывается основное свойство
       ValueNode->Text = WideString(StringGrid1->Cells[i][j]);
       //Имеем например: <Cell>37</Cell>
       ValueNode->Attributes[WideString("column")] = i;
       ValueNode->Attributes[WideString("row")] = j;
       //Имеем: <Cell column="0" row="2">37</Cell>
   }

//Путь к файлу, куда сохранять
AnsiString filename = ExtractFileDir(Application->ExeName) + "\\data.xml";
//Сохранение в файл
XMLDocument1->SaveToFile(WideString(filename));
//Сохранение в строку AnsiString
AnsiString xmlbuf;
XMLDocument1->SaveToXML(xmlbuf);
RichEdit1->Lines->Clear();
RichEdit1->Lines->Add(xmlbuf);
//Эту строку можно легко записать в базу данных
}
//---------------------------------------------------------------------------
void __fastcall TForm1::BLoadClick(TObject *Sender)
{
//Путь к файлу
AnsiString filename = ExtractFileDir(Application->ExeName) + "\\data.xml";
//Загрузка структуры из файла
XMLDocument1->LoadFromFile(WideString(filename));

//Также можно грузить из AnsiString'а:
//XMLDocument1->LoadFromXML(AnsiString &)

//Получение корневого нода
_di_IXMLNode MainNode = XMLDocument1->DocumentElement;//->ChildNodes->GetNode(0);
//Получение его атрибутов, по умолчанию считается, что это нод "StringGrid"
//если не он — будет ошибка из-за отсутствия таких атрибутов
StringGrid1->ColCount = int(MainNode->Attributes[WideString("cols")]);//operator int()
StringGrid1->RowCount = int(MainNode->Attributes[WideString("rows")]);//operator int()


int count = XMLDocument1->ChildNodes->Count;//Количество дочерних нодов корня всего документа
//<?xml version="1.0" encoding="UTF-8" standalone="no"?> — 1-ый
//<!DOCTYPE SampleData SYSTEM "sth.dtd"> — 2-ой
//3-й — есть "StringGrid"

count = MainNode->ChildNodes->Count;//число дочерних нодов нашего корня "StringGrid"
Caption = count;
for(int i=0; i<count; i++)
{  //Перебор всех этих дочерних по индексу
   _di_IXMLNode SGridNode = MainNode->ChildNodes->GetNode(i);
   //Получение координат из аттрибутов
   int x = int(SGridNode->Attributes[WideString("column")]);
   int y = int(SGridNode->Attributes[WideString("row")]);
   //Запись в грид
   StringGrid1->Cells[x][y] = SGridNode->Text;
}
}
//---------------------------------------------------------------------------


User Attached Image Скачать файл
_020_xml_2005.04.28___22.20.rar


Finder_adventures
Отправлено: 29.04.2005, 10:50


Ученик-кочегар

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



Пасиба!! Попробую разобраться

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