Поиск текста в памяти без визуального компонента в C ++ Builder - PullRequest
0 голосов
/ 26 марта 2020

Я использую C ++ Builder 10.3 с платформой VCL 32bit. Мне нужно знать лучший способ поиска текстового файла в памяти. Я написал код ниже, который открывает текстовый файл в компоненте RichEdit, ищет и выделяет некоторый текст. RichEdit предназначен для использования в качестве визуального компонента. TMemoryStream и TStringStream используются в памяти, но не предлагают методы FindText, SelStart, SelLength и SelText. Вы можете показать, как это сделать в памяти?

UnicodeString MyCrumb;
int StartPos=0, ToEnd=0, FoundAt=0, StartCrumb=0;
TSearchTypes mySearchTypes = TSearchTypes();


RichEdit1->Lines->LoadFromFile( "CrumbFile.txt" );

ToEnd = RichEdit1->Text.Length();

FoundAt  = RichEdit1->FindText(L"CrumbStore", StartPos, ToEnd, mySearchTypes);
StartPos = FoundAt+10;
FoundAt  = RichEdit1->FindText("crumb", StartPos, ToEnd, mySearchTypes);
StartPos = FoundAt+8;

StartCrumb = FoundAt+8;
FoundAt  = RichEdit1->FindText("}", StartPos, ToEnd, mySearchTypes);
EndPos = FoundAt-1;

RichEdit1->SelStart  = StartPos;
RichEdit1->SelLength = ( EndPos-StartPos );
MyCrumb = RichEdit1->SelText;

1 Ответ

1 голос
/ 28 марта 2020

Способ VCL - использовать класс TStringList вместо визуальных компонентов. Однако весь файл будет загружен в память.

#include <iostream>
#include <memory>
using namespace std;
void FindTextVcl() 
{
    unique_ptr<TStringList> txt(new TStringList());
    txt->LoadFromFile(L"Example.txt"); // Use appropriate TEncoding if need
    for (int line_num = 0; line_num != txt->Count; line_num++)
    {
        int pos = txt->Strings[line_num].Pos("there");
        if (pos > 0)
        {
            cout << "Found at line " << line_num + 1 << ", position " << pos << endl;
            break;
        }
    }
}

Стандартный способ работы с библиотекой подобен следующему примеру (используйте wstring и wifstream для UTF-16). Это работает для больших файлов, потому что в память загружается только текущая строка.

#include <iostream>
#include <fstream>
#include <string>
using namespace std;
void FindTextStd()
{
    ifstream txt("Example.txt");
    if (txt.is_open())
    {
        size_t pos = 0;
        size_t line_num = 0;
        string line;
        while (getline(txt, line))
        {
            line_num++;
            pos = line.find("there");
            if (pos != string::npos)
            {
                cout << "Found at line " << line_num << ", position " << pos + 1 << endl;
                break;
            }
        }
    }
}
...