Поиск:

Ответ в темуСоздание новой темы Создание опроса
> считывание из 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   Вверх
SABROG
Дата 11.12.2007, 18:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


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

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



Зачем тебе пихать что-то в memo в цикле, оно затираться будет в любом случае ?

Я говорю про кусок кода, где тебе нужно выводить строки. Я правильно понимаю структуру, в ListBox'e есть итемы, каждому итему назначена структура grp, каждая структура grp содержит какие-то данные, в том числе и многострочное info ? Видимо при клике на итем куда-то у тебя отображаются все эти данные из grp. Некое подобие базы данных ? Так вот я не вижу никаких припятствий в том, чтобы AnsiString заменить на указатели TStringList. А при выборе итема делать Memo->Assign(grp->moyStringList); 


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


Эксперт
****


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

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



SABROG огромное тебе спасибо, ты натолкнул на мысль. Сделал проще:
Структуру не менял. Просто в обработчике клика по ListBox1 написал:
Код

Memo1->Lines->Delimiter='|';
Memo1->Lines->DelimitedText=grp[index].inf;

А при добавлении записи в вектор:
Код

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

В inf у меня всегда хранится DelimitedText. Всё сохраняется и считывается, т.е. всё круто. Ещё раз ОГРОМНОЕ тебе спасибо!

Но у меня маленький вопросик:
Если в Memo:
       ===========================
       привет
       как дела
       пока
       ===========================
то в inf:
       ===========================
       привет|"как дела"|пока
       ===========================
Так вот, если юзверь захочет в Memo нарисовать рожицу с использованием '|', могут быть проблемы. Можно ли вместо одного символа использовать несколько.


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


Hacker
****


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

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



Нет, там тип char. Т.е. всего 1 байт отведен под эти цели. Но можно попробывать использовать непечатные символы, например 0x00-0x1F. Только не знаю запишется ли строка в .ini файл.

Еще есть сомнения насчет интерпретации разделителя внутри кавычек " ". Экспериментируй, сделай стресстест.


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


Эксперт
****


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

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



Всё равно, БОЛЬШОЕ тебе спасибо.

Это сообщение отредактировал(а) artsb - 11.12.2007, 22:19


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


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


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

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



Народ, если честно - не понимаю, зачем так все сложно? Есть ведь функция StringReplace. Юзается примерно следующим образом:
При записи в ini-файл:
Код
fl->WriteString(IntToStr(i),"info",StringReplace(grp[i].inf.c_str(),"\r\n","||",TReplaceFlags() << rfReplaceAll));

Считывается, соответственно, с обратной заменой
Код
temp.inf=StringReplace(fl->ReadString(IntToStr(i),"info",""),"||","\r\n",TReplaceFlags() << rfReplaceAll));
Писал навскидку, где-то мог и накосячить, по мелочам отсылаю к отладке... В данном способе - можно в качестве разделителя строк использовать любой шаблон, какой взбредет в голову, хоть другую строку...


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


Эксперт
****


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

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



ama_kid ты прав, спасибо попробую.


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


Hacker
****


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

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



Цитата(artsb @ 11.12.2007,  23:33)
ama_kid ты прав, спасибо попробую.

Как по мне, так мой вариант все же компактней. И я проверил, если разделитель стоит внутри кавычек, то он не считается разделителем. Даже если пользователь напишет строку в кавычках, скажем цитирование, да еще и со смайликом:
"Ни дня без строчки кода :|"

То все обрабатывается нормально и точно также выведется без искажений. Внутренние кавычки не посчитаются за новую строку и смайлик не посчитается за разделитель.


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


Эксперт
****


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

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



SABROG кавычки ставятся только если есть пробелы в строке (обрати внимание).
Например:
-------------------------
Привет.
Как дела?
Пока.
-------------------------
будет записано как:
Привет.|"Как дела?"|Пока

А если так:
-------------------------
Привет.
Какдела?
Пока.
-------------------------
то будет записано как:
Привет.|Какдела?|Пока

Это сообщение отредактировал(а) artsb - 12.12.2007, 15:26


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


Hacker
****


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

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



Отсутствие кавычек никак не влияет на работу

user posted image

В общем, если символ разделителя или пробелы появляются в строке, то она экранируется кавычками.

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


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


Эксперт
****


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

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



Теперь всё норамально. Спасибо.


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

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

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

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

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


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

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


 




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


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

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