在C ++ Builder中没有可视组件的情况下在内存中搜索文本

问题描述 投票:0回答:1

我正在VCL 32位平台上使用C ++ Builder 10.3。我需要知道在内存中搜索文本文件的最佳方法。我在下面编写了代码,该代码将一个文本文件打开到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;
delphi c++builder
1个回答
0
投票

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;
        }
    }
}

标准库方式类似于以下示例(对于UTF-16,使用wstringwifstream)。这适用于大文件,因为内存中仅加载了当前字符串。

#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;
            }
        }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.