Поиск:

Ответ в темуСоздание новой темы Создание опроса
> считывание из ini файла 
:(
    Опции темы
artsb
  Дата 10.12.2007, 01:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2280
Регистрация: 17.7.2007
Где: центр Вселенной

Репутация: 39
Всего: 64



В ini файл из структуры:
Код

struct gr{
AnsiString name;
AnsiString www;
AnsiString inf;
};
vector<gr> grp;

записывается информация вот так:
Код

TIniFile *fl=new TIniFile(p);
fl->WriteInteger("gn","k",grp.size());
for(int i=0;i<grp.size();i++)
{
        fl->WriteString(IntToStr(i),"name",grp[i].name);
        fl->WriteString(IntToStr(i),"www",grp[i].www);
        fl->WriteString(IntToStr(i),"info",grp[i].inf.c_str());
}
delete fl;

Считываю так:
Код

   TIniFile *fl=new TIniFile(flinf.path);
   int k=fl->ReadInteger("gn","k",0);
   for(int i=0;i<k;i++)
   {
                temp.name=fl->ReadString(IntToStr(i),"name","");
                temp.www=fl->ReadString(IntToStr(i),"www","");
                temp.inf=fl->ReadString(IntToStr(i),"info","");
                grp.push_back(temp);
                ListBox1->AddItem(temp.name,ListBox1);
   }
   delete fl;


Проблема в том, что в inf может храниться не одна строка, а несколько, и записываться та они записываются, а вот считываться все не хотят, только первая.
Как быть?

Это сообщение отредактировал(а) artsb - 10.12.2007, 01:07


--------------------
Чем отличается умный человек от мудрого?
Умный - выпутается из любой ситуации.
Мудрый - просто в неё не попадёт.
PM MAIL   Вверх
SABROG
Дата 10.12.2007, 17:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


Профиль
Группа: Завсегдатай
Сообщений: 2481
Регистрация: 18.9.2006

Репутация: 3
Всего: 91



ReadSectionValues ?


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
artsb
Дата 10.12.2007, 19:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2280
Регистрация: 17.7.2007
Где: центр Вселенной

Репутация: 39
Всего: 64



К сожалению нет, потому что ReadSectionValues читает значения параметров выбранного РАЗДЕЛА.


--------------------
Чем отличается умный человек от мудрого?
Умный - выпутается из любой ситуации.
Мудрый - просто в неё не попадёт.
PM MAIL   Вверх
SABROG
Дата 10.12.2007, 22:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


Профиль
Группа: Завсегдатай
Сообщений: 2481
Регистрация: 18.9.2006

Репутация: 3
Всего: 91



Юзай XML и не майся. Или разбивай Ini файл по секциям типа:

Код

[options]
size=1000
[0]
name=0
www=0
inf=0
[1]
name=1
www=1
inf=1
[2]
name=2
www=2
inf=2
[3]
name=3
www=3
inf=3
..
[1000]
name=1000
www=1000
inf=1000




--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
artsb
Дата 10.12.2007, 22:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2280
Регистрация: 17.7.2007
Где: центр Вселенной

Репутация: 39
Всего: 64



У меня как раз такой вид как ты привёл.
Но, если в Memo написано:
------------------------------
Привет
Как дела?

Что делаешь?
------------------------------
То в файл записывается:
------------------------------
[i]
name=...
www=...
inf=Привет
Как дела?

Что делаешь?
------------------------------
А при считывании из inf в переменную считывается только "Привет".

С XML я работать не умею. :(


--------------------
Чем отличается умный человек от мудрого?
Умный - выпутается из любой ситуации.
Мудрый - просто в неё не попадёт.
PM MAIL   Вверх
ama_kid
Дата 10.12.2007, 22:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


АСУТП-кодер
***


Профиль
Группа: Комодератор
Сообщений: 1460
Регистрация: 5.3.2007
Где: Москва

Репутация: 10
Всего: 95



Цитата(artsb @  10.12.2007,  01:05 Найти цитируемый пост)
в inf может храниться не одна строка, а несколько
Не совсем понятно, как это ты в AnsiString хранишь несколько строк, это ведь не массив. Если имеется ввиду несколько строк, разделенных #13#10, в виде одной строки, - тогда можно попробовать сделать замену символов конца строки на свой строковый разделитель(например, таб или точку с запятой) при записи и обратной замене при считывании...

Добавлено через 1 минуту и 59 секунд
ага, понял smile
попробуй сделать как я посоветовал (замена символов между строк)


--------------------
самурай без меча подобен самураю с мечом, но только без меча 
PM MAIL   Вверх
artsb
Дата 10.12.2007, 22:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2280
Регистрация: 17.7.2007
Где: центр Вселенной

Репутация: 39
Всего: 64



Вот так:
Код

gr temp;
temp.name=Edit2->Text;
temp.www=Edit1->Text;
temp.inf=Memo1->Lines->Text;
grp.push_back(temp);



--------------------
Чем отличается умный человек от мудрого?
Умный - выпутается из любой ситуации.
Мудрый - просто в неё не попадёт.
PM MAIL   Вверх
SABROG
Дата 11.12.2007, 09:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


Профиль
Группа: Завсегдатай
Сообщений: 2481
Регистрация: 18.9.2006

Репутация: 3
Всего: 91



Цитата

попробуй сделать как я посоветовал (замена символов между строк) 


Да, тогда придется делать замену символа разделения строк. Если не ошибаюсь то в Memo используется класс
TStrings, надо его привести к классу TStringList, у него должен быть метод для изменения разделителя. А потом уже в AnsiString. Обратная схема та же, сначала в AnsiString, потом TStringList, установка разделителя и уже его присваиваем Memo.

Цитата

С XML я работать не умею. :(


Значит пора научиться ;)


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
artsb
Дата 11.12.2007, 10:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2280
Регистрация: 17.7.2007
Где: центр Вселенной

Репутация: 39
Всего: 64



Может будет проще изменить структуру?


--------------------
Чем отличается умный человек от мудрого?
Умный - выпутается из любой ситуации.
Мудрый - просто в неё не попадёт.
PM MAIL   Вверх
SABROG
Дата 11.12.2007, 12:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


Профиль
Группа: Завсегдатай
Сообщений: 2481
Регистрация: 18.9.2006

Репутация: 3
Всего: 91



В таком случае структура может быть такой:
Код

[options]
size=1000
[0]
name=0
www=0
inf_strings=3
0=Привет!
1=Как дела ?
2=Че не в инсте ?
[1]
name=1
www=1
inf_strings=2
0=Я слышал ты в компах шаришь ?
1=Че у меня качает медленно ?
[2]
name=2
www=2
inf_strings=4
0=Жжош!
1=Бугага!
2=Первонах!
3=кг/ам!
[3]
name=3
www=3
inf_strings=1
0=xor eax, eax
..
[1000]
name=1000
www=1000
inf_strings=0


Насчет TStringList. Можно установить разделитель в свойстве Delimiter, потом считать все строки через свойство DelimitedText и записать в один ключ.

Это сообщение отредактировал(а) SABROG - 11.12.2007, 12:30


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
artsb
Дата 11.12.2007, 15:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2280
Регистрация: 17.7.2007
Где: центр Вселенной

Репутация: 39
Всего: 64



Как вариант можно можно использовать такую структуру, но мне кажется что это не удобно.
SABROG не мог бы ты дать пример кода, как реализовать через TStringList.
ama_kid можешь тоже дать примерчик, по предложенному тобой способу. 



--------------------
Чем отличается умный человек от мудрого?
Умный - выпутается из любой ситуации.
Мудрый - просто в неё не попадёт.
PM MAIL   Вверх
SABROG
  Дата 11.12.2007, 17:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


Профиль
Группа: Завсегдатай
Сообщений: 2481
Регистрация: 18.9.2006

Репутация: 3
Всего: 91



Исходник в аттаче

user posted image

Присоединённый файл ( Кол-во скачиваний: 16 )
Присоединённый файл  DelimitedText.rar 3,18 Kb


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
artsb
Дата 11.12.2007, 17:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2280
Регистрация: 17.7.2007
Где: центр Вселенной

Репутация: 39
Всего: 64



SABROG спасибо. Как работает понял. Но проблема в том, что иформация из файла копируется в вектор в inf. А у AnsiString я что-то не нашёл DelimitedText. Как быть?


--------------------
Чем отличается умный человек от мудрого?
Умный - выпутается из любой ситуации.
Мудрый - просто в неё не попадёт.
PM MAIL   Вверх
SABROG
Дата 11.12.2007, 18:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


Профиль
Группа: Завсегдатай
Сообщений: 2481
Регистрация: 18.9.2006

Репутация: 3
Всего: 91



Заменить AnsiString на указатель на TStringList в структуре нельзя ?
Куда в итоге выводится inf ? Если в Memo, то строки вполне могут сидеть в AnsiString'е "до востребования".

Это сообщение отредактировал(а) SABROG - 11.12.2007, 18:11


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
artsb
Дата 11.12.2007, 18:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2280
Регистрация: 17.7.2007
Где: центр Вселенной

Репутация: 39
Всего: 64



Код

   TIniFile *fl=new TIniFile(flinf.path);
   int k=fl->ReadInteger("gn","k",0);
   for(int i=0;i<k;i++)
   {
                temp.name=fl->ReadString(IntToStr(i),"name","");
                temp.www=fl->ReadString(IntToStr(i),"www","");
                temp.inf=fl->ReadString(IntToStr(i),"info","");            //<-------- Вот
                grp.push_back(temp);
                ListBox1->AddItem(temp.name,ListBox1);
   }
   delete fl;

Можно конечно сделать так:
Код

   TIniFile *fl=new TIniFile(flinf.path);
   int k=fl->ReadInteger("gn","k",0);
   for(int i=0;i<k;i++)
   {
                temp.name=fl->ReadString(IntToStr(i),"name","");
                temp.www=fl->ReadString(IntToStr(i),"www","");
                Memo1->Lines->Delimiter ="|";
                Memo1->Lines->DelimitedText = fl->ReadString(IntToStr(i),"info","");
                temp.inf= Memo1->Lines->Text;  
                grp.push_back(temp);
                ListBox1->AddItem(temp.name,ListBox1);
   }
   delete fl;

Но так в Memo будет текст мигать. И это долго, по-моему.


--------------------
Чем отличается умный человек от мудрого?
Умный - выпутается из любой ситуации.
Мудрый - просто в неё не попадёт.
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C++ Builder | Следующая тема »


 




[ Время генерации скрипта: 0.1141 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.