我正在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;
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,使用wstring
和wifstream
)。这适用于大文件,因为内存中仅加载了当前字符串。
#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;
}
}
}
}