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

 
Строки... Файлы... [Help me], Работа со строками в Memo
dEEp
Отправлено: 19.02.2005, 01:57


Дежурный стрелочник

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



Итак...
Нужна программа или хотя бы описание действий.
Мне нужно, чтобы программа считывала информацию, причём ввиде
символы-числа-числа (Например SuXx-012012-005). Затем эта информация выводится в "Memo". При нажатии кнопки (оределённой) происходит сортировка загруженных строк по первому параметру (в примере это — SuXx), по второму параметру (в примере это — 012012) или по третьему. Затем пользователь может сохранить это в отдельный файл. Вот так.

Я реализовал загрузку, и сохранение файла.
Но т.к. почти ничего не знаю о строках, то спрашиваю. Каким образом можно во время загрузки файла проверить, пишется ли он правильно (т.е. как в примере — символы-числа-числа).
Ещё... Каким образом реализовать сортировку строк?
Спасибо заранее. Если что, то пишите на z00@mail.ru
Guest
Отправлено: 19.02.2005, 13:10


Не зарегистрирован







QUOTE
Я реализовал загрузку, и сохранение файла.
biggrin.gif

То есть Вы написали 2 строчки кода:

Memo1->Lines->LoadFromFile("...");
и
Memo1->Lines->SaveToFile("...");

а теперь хотите чтобы Вам написали
всю остальную часть программы ??? smile.gif
Или перечислили возможные варианты действий ?

xim
Отправлено: 19.02.2005, 18:31


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

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



Guest, ирония здесь не к месту (см. на фотку автора smile.gif )

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. Всё! Готово. Я доделал!

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