Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C++ Builder > строки в Memo


Автор: RaugaJ 17.6.2006, 21:51
Тема вот в чем: имеется файл, который выводится в Мемо1, затем берем другой файл и ывводим его в Мемо2. Теперя нужно вычесть из первого второй и записать результат в Мемо3.

Мои действия: получил текст в char*-формате(массив char), теперь мне нужно весь текст разделить на массив строк(поскольку сравнение будет проходить построкам). Те приемы, которыми пользовался в Тurbo, в Builder  не прокатывают. Подскажите код плиз, и если кто знает, может есть какие-либо стандартные ф-ции в Builder, выполняющие поиск в Мемо?   

Автор: Mysterio 18.6.2006, 12:46
RaugaJ, если тебе нужно именно  с использованием char  тогда можно ловить строки, например, по символу Enter(13) + учитывать разбиения этих строк при изменении размеров компонента(т.е. визуально их будет больше). Гораздо проще и быстрее делается с использованием Memo1->Lines->Strings[x] типа AnsiString. Если исходный текст в char[], и не разделён, добавь .c_str(), что поможет преобразовать его к тому же AnsiStringу.

А как понять "вычесть из первого второй"? По числу символов или по повторениям, или ещё как? 

Автор: RaugaJ 18.6.2006, 17:21
Вычесть, значит оставить те строки, которые есть в первом и которых нет во втором.   

Автор: W0LF 18.6.2006, 18:36
Вот тебе пример, правда писал давно, извини за некрасивый код, щас времени нет заниматься рефакторингом и читабельностью smile):
Код

void breakMemo(TMemo* Memo1,String*& finallyStringArray){
  int numberOfLines = Memo1->Lines->Capacity;
  finallyStringArray = new String[1000];
  int finallyStringNumber = 0;
  for(int i = 0; i < numberOfLines; i++){
        String sTmpLine = Memo1->Lines->Strings[i];
        char *cTmpLine = sTmpLine.c_str();
        int lengthOfLine = sTmpLine.Length();
        int positionInLine=0;
        int positionFloatLeft=0;
        int positionFloatRight=0;
        while(positionInLine != lengthOfLine){
                if (cTmpLine[positionInLine] != ' '){
                        positionFloatLeft = positionInLine;
                        for(int j = positionInLine; j < lengthOfLine; j++){
                                if (cTmpLine[j] == ' '){
                                        positionFloatRight = j;
                                        positionInLine = j;
                                        break;
                                }else
                                if (j==lengthOfLine-1){
                                        positionFloatRight = j+1;
                                        positionInLine = j;
                                        break;
                                }
                        }
                           String sFloat  =   sTmpLine.SubString(positionFloatLeft,positionFloatRight-positionFloatLeft+1);
                           finallyStringArray[finallyStringNumber] = String(sFloat);
                }          finallyStringNumber++;
                positionInLine++;
        }
  }
}

Это работающий код, везде стоит Float(sFloat, positionFloatRight и т.д), ибо я разбивал на вещественные, поэтому так и называл для себя, еще одна недоработка - выделение памяти под масиив finallyStringArray. Будет глупо перед этим вставить цикл, который будет искать кол-во слов в Memo(повторяющийся код). Лучше возьми std::vector, там динамическое выделение памяти, если не знаешь как, пиши, я тебе переделаю с std::vector, там быстро, но у меня щас ваще нет времени.
   

Автор: W0LF 18.6.2006, 19:15
Так, немного освободился, и подумал, что некрасиво все-таки недаработанное давать. 
Так вот, самое простое использование std::vector без итераторов:
в функции поменять параметр "String*& finallyStringArray" на 
                                                     "std::vector<String>&  "finallyStringArr"
                  поменять строку "finallyStringArray[finallyStringNumber] = String /*даже не знаю, че я
                                               здесь String влепил smile*/ (sFloat);" на 
                                               "finallyStringArray.push_back(sFloat);"
Теперь объявление vector:
Код

#include <vector>;
std::vector<String> finallyStringArray;

Использование vector:
Код

String *s  = new  String[14];
for(int i=0;i<14;i++){
    s[i] = finallyStringArray.at(i);
}

Да, и еще, там немного неправильно слова резало:
замени "String sFloat  =   sTmpLine.SubString(positionFloatLeft,positionFloatRight-positionFloatLeft+1);" на
"String sFloat  =   sTmpLine.SubString(positionFloatLeft+1,positionFloatRight-positionFloatLeft);"
Это все, если разделитель - пробел, если нужен другой символ, то просто добавь его, например:
Код

if ((cTmpLine[j] == ' ')|| (cTmpLine[j] == ',')){
...
}

Все, высказался(выписался как-то неудобно smile ).  

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)