dEEp |
Отправлено: 19.02.2005, 01:57 |
|
Дежурный стрелочник
Группа: Участник
Сообщений: 69
|
Итак...
Нужна программа или хотя бы описание действий.
Мне нужно, чтобы программа считывала информацию, причём ввиде
символы-числа-числа (Например SuXx-012012-005). Затем эта информация выводится в "Memo". При нажатии кнопки (оределённой) происходит сортировка загруженных строк по первому параметру (в примере это — SuXx), по второму параметру (в примере это — 012012) или по третьему. Затем пользователь может сохранить это в отдельный файл. Вот так.
Я реализовал загрузку, и сохранение файла.
Но т.к. почти ничего не знаю о строках, то спрашиваю. Каким образом можно во время загрузки файла проверить, пишется ли он правильно (т.е. как в примере — символы-числа-числа).
Ещё... Каким образом реализовать сортировку строк?
Спасибо заранее. Если что, то пишите на z00@mail.ru
|
|
Guest |
Отправлено: 19.02.2005, 13:10 |
|
Не зарегистрирован
|
QUOTE | Я реализовал загрузку, и сохранение файла. |
То есть Вы написали 2 строчки кода:
Memo1->Lines->LoadFromFile("...");
и
Memo1->Lines->SaveToFile("...");
а теперь хотите чтобы Вам написали
всю остальную часть программы ???
Или перечислили возможные варианты действий ?
|
|
xim |
Отправлено: 19.02.2005, 18:31 |
|
Станционный диспетчер
Группа: Участник
Сообщений: 143
|
Guest, ирония здесь не к месту (см. на фотку автора )
1. Только парсинг:
CODE |
BOOL is_npart_str(const char const *pstr, int kind=0)
// kind: 0-строка; 1-число
{
if(!pstr)return FALSE;
char *tmp=dynamic_cast<char *>(pstr),
while(*tmp){
switch(kind)
{
case 0:
if(!isalpha((int)*tmp))return FALSE; // только латиница
break;
case 1:
if(!strchr("0123456789",*tmp))return FALSE; // не пинайте
break;
}
tmp++;
}
}
BOOL is_my_str(const char const *str)
{
if(!str)return FALSE;
char tmp[MY_SIZE]; // ну или динамически — в зависимости от вариации размеров
strcpy(tmp,str);
char *s1_part=tmp,
*s2_part=strchr(tmp,'-'),
*s3_part;
if(s2_part)*s2_part=0;else return FALSE;
s2_part++;
s3_part=strchr(s2_part,'-');
if(s3_part)*s3_part=0;else return FALSE;
s3_part++;
BOOL res=TRUE;
res=res&&is_npart_str(s1_part);
res=res&&is_npart_str(s2_part,1);
res=res&&is_npart_str(s3_part,1);
return res;
}
// могут быть ошибки — написано в местном редакторе
|
2.
Надоело писать — см. Help по qsort (там есть пример) |
|
Guest |
Отправлено: 20.02.2005, 03:24 |
|
Не зарегистрирован
|
Народ!
Я тут почти сделал. Вот меня интересует, как обратится ко второй строке в Memo. Ну к примеру её нужно обработать также как и первую. Что сделать? |
|
Gotica |
Отправлено: 21.02.2005, 05:48 |
|
Ученик-кочегар
Группа: Участник
Сообщений: 9
|
По-поводу сортировки строк.
Можно задать цикл с каким-нибудь уникальным разделителем. Например "^" или что-то в этом роде. т.е. процедура сохранения может идти в текстовый файл как одна строка.
Например есть строки, AnsiString a,b,c,d... и AnsiString all;
Перед сохранением all=a+"^"+b+"^"+"c"+"^"+d+...
Далее сохраняем просто строку all;
А вот в процедуре открытия делаем, например AnsiString buf; и обращаемся в цикле к каждому символу в поисках "^";
CODE |
int x=1;
do
{
a=a+buf[x];
x++;
if(buf[x]=='^')
{
break;
}
}
while(x>0);
x++;
do
{
b=b+buf[x];
x++;
if(buf[x]=='^')
{
break;
}
}
while(x>0);
x++;
и т.д (можно, конечно, сделать более компактно, но так по мне наглядней.) Так же с помощью уникальных разделителей, можно передвигаться и по строкам в самом Memo.
|
А дальше уже "распихиваешь" эти переменные по Memo.
Отредактировано Gotica — 21/02/2005, 05:53 |
|
Guest |
Отправлено: 27.02.2005, 13:04 |
|
Не зарегистрирован
|
Это dEEp. Всё! Готово. Я доделал! |
|