1 Востаннє редагувалося roctik1996 (06.12.2014 12:32:48)

Тема: Пошук тексту в масиві рядків String (C++ Builder 6)

Добрий день, потрібна допомога з пошуком....
в мене є об'ємний текст (близько 160 сторінок) з нього потрібно вибрати рядки в яких міститься слово ''Тема: '' і записати в масив
алгоритм випробовую на текстовому файлі в якому 15 рядків і 4 з них зі словом ''Тема: ''
після виконання отримав щось схоже на це(див. скріншот)
P.S. там повинно бути тільки 4 рядків...
ось код:

String arr[10];
int i, a[10], j,k,index,n;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
Memo2->Lines->LoadFromFile("example.txt");

n=StrToInt(Memo2->GetTextLen());//Визначення величини тексту

//створення масиву зі всього тексту
AnsiString *str=new AnsiString [n];
for(i=0;i<n;i++)
str[i]=Memo2->Text;

//пошук тем
for(i=0;i<n;i++)
if(str[i].Pos("Тема: "))
{
for(j=0;j<10;j++)
a[j]=i;//створення масиву з індексами де знаходяться теми(це для подальшого використання)
for(k=0;k<10;k++)
arr[k]=str[i];//створення масиву з темами
}
for(k=0;k<10;k++)
ListBox1->Items->Append(arr[k]);
delete []str;
}
Post's attachments

Безымянный.png 300 kb, 387 downloads since 2014-12-06 

2

Re: Пошук тексту в масиві рядків String (C++ Builder 6)

Набрати чотири рази таку послідовність букв у вас не вийшло б, тому я роблю висновок, що у вас лише одна така назва теми (хоча по-хорошому це ви мали б написати самостійно). Назва виводиться десять разів, тому дивіться, що ви робите в циклах в 20-му, 22-му і 25-му рядку. Я можу тільки здогадуватись, тому що ви не відформатували код, а самостійно його форматувати і пробиратись крізь нього я не хочу, ну і ви попереплітали код алгоритму з кодом форми (нащо взагалі для випробування алгоритму використовувати форму?).

3

Re: Пошук тексту в масиві рядків String (C++ Builder 6)

quez написав:

Назва виводиться десять разів, тому дивіться, що ви робите в циклах в 20-му, 22-му і 25-му рядку

тут я помилку зрозумів, дякую)))
розпишу в чому суть
але пошук не працює правильно
в мене є текстовий документ
зразок:
''Тема: назва теми
текст текст
текст текст
текст текст
Тема: назва теми
текст текст
текст текст
.....'' і так багато разів))
потрібно зробити масив усього що йде після слова ''Тема: ''(тобто масив з назв тем) і цей масив використати для створення Items в ListBox.
і це все повинно оброблюватись до того як запуститься програма

4

Re: Пошук тексту в масиві рядків String (C++ Builder 6)

Ви при кожному співпадінні теми повністю переписуєте arr. У вас ота тема «фпфпй...» остання, чи не так?

5

Re: Пошук тексту в масиві рядків String (C++ Builder 6)

Дуже багато зайвих рухів. Все, що вам треба - перебрати Memo2->Lines->Strings на відповідні і їх позаносити в ListBox1. LoadFormFile - for - if - Append. Все.
А оскільки насправді файл великий, то вам і Memo не дуже зручне для цього. Створюйте напряму TStringList і з ним працюйте.

6

Re: Пошук тексту в масиві рядків String (C++ Builder 6)

quez написав:

Ви при кожному співпадінні теми повністю переписуєте arr. У вас ота тема «фпфпй...» остання, чи не так?

Post's attachments

Безымянный.png 468.59 kb, 293 downloads since 2014-12-06 

7

Re: Пошук тексту в масиві рядків String (C++ Builder 6)

Зразу треба було викласти цей скрін. Дивіться в функцію Pos, що вона робить. Може вона винна, а може й ні. Я ніяк не збагну, до чого ті вкладені цикли.

8 Востаннє редагувалося roctik1996 (06.12.2014 14:05:53)

Re: Пошук тексту в масиві рядків String (C++ Builder 6)

quez написав:

Я ніяк не збагну, до чого ті вкладені цикли.

той що рахує j

for(j=0;j<10;j++)

тут в даному випадку зайвий, він потрібний для створення масив з тими індексами де знаходяться теми(це для подальшої роботи)
решта потрібна

9

Re: Пошук тексту в масиві рядків String (C++ Builder 6)

Кому цікаво...

TStringList *str=new TStringList;
str->LoadFromFile("example.txt");
for (int i=0; i<str->Count; i++)
                {
if(str->Strings[i].Pos("Тема:"))
        {
        ListBox1->Items->Add(str->Strings[i]);
        }
                }
delete str;
Подякували: 0xDADA11C7, koala2