如何解析较大的.txt文本

zt03001309 2004-10-20 05:10:28
我要解析一个近200K的文本内容,可是总是读不出其内容,代码如下:
TStringList *list = new TStringList();
list->LoadFromFile("C:\\aaa.TXT");
AnsiString str = "certain string";

int pos = list->Text.Pos(str);
ShowMessage(IntToStr(pos)+list->Count);
结果pos总是为0,list->Count也总是1
这是怎么回事啊,到底哪里出了错?
...全文
266 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
fengfeiwuwq 2004-11-10
  • 打赏
  • 举报
回复
我觉得应该没这么复杂吧
因为TStringList类有一个Strings属性
这是它处理字符串的一个指针数组类型
我估计你在处理的时候没让程序取list->Count的值
读入了多少个"\r\n"那么就有多少个Count值
这样的话就简单了
再调试跟踪
解决问题应没什么问题
wt_sanlian 2004-11-10
  • 打赏
  • 举报
回复
用AnsiPos 试试
yysinger 2004-11-10
  • 打赏
  • 举报
回复
我最近要使用BCB作项目了,还不是太会啊,希望大家多多执教
GeoPhoenix 2004-11-09
  • 打赏
  • 举报
回复
用写字板转换以下存成纯文本文件就可以了

梦回童年001 2004-11-08
  • 打赏
  • 举报
回复
zt03001309 2004-10-30
  • 打赏
  • 举报
回复
突然发现,原来那个.txt文件居然是Unicode编码方式的,难怪读不出来
那现在该怎么办啊?
peibosys 2004-10-25
  • 打赏
  • 举报
回复
int pos = list->Text.Pos(str);
建议你ShowMessage(list->Text); 看看
类库 2004-10-25
  • 打赏
  • 举报
回复
Jeffrey Richter的《Windows核心编程》上使用内存映射文件例子

SYSTEM_INFO sinf;
::GetSystemInfo(&sinf);

HANDLE hFile = ::CreateFile(lpFileName,
GENERIC_READ,
FILE_SHARE_READ,
NULL,
OPEN_EXISTING,
FILE_FLAG_SEQUENTIAL_SCAN,
NULL);
HANDLE hFileMapping = ::CreateFileMapping(hFile,
NULL,
PAGE_READONLY,
0,
0,
NULL);
DWORD dwFileSizeHigh;
__int64 qwFileSize = ::GetFileSize(hFile, &dwFileSizeHigh);
qwFileSize += (((__int64) dwFileSizeHigh) <<32);

::CloseHandle(hFile);

__int64 qwFileOffset = 0;
ProgressBar1->Max = qwFileSize/sinf.dwAllocationGranularity;
//ProgressBar1->Step = ProgressBar1->Max/10000;
ProgressBar1->Position = 0;

while(qwFileSize > 0)
{
DWORD dwBytesInBlock = sinf.dwAllocationGranularity;
if(qwFileSize < sinf.dwAllocationGranularity)
dwBytesInBlock = (DWORD)qwFileSize;
PBYTE pbFile = (PBYTE)::MapViewOfFile(hFileMapping,
FILE_MAP_READ,
(DWORD)(qwFileOffset>>32),
(DWORD)(qwFileOffset&0xffffffff),
dwBytesInBlock);
//do what you want
for (DWORD dwByte=0; dwByte < dwBytesInBlock; dwByte++)
{
pbFile[dwByte]=..... //这里就可以把pbFile当成数组使用了
}

::UnmapViewOfFile(pbFile);

qwFileOffset += dwBytesInBlock;
qwFileSize -= dwBytesInBlock;

Application->ProcessMessages();

}

::CloseHandle(hFileMapping);
cczlp 2004-10-21
  • 打赏
  • 举报
回复
200K, 很小啊,应该没问题的。你的文件内容是文本的吗?
Maconel 2004-10-21
  • 打赏
  • 举报
回复
还是用专门读文件的方法来做的。我常用的是vcl的函数,FileOpen 之类的。
下面这个例子是将一个文件内容读到另一个文件中并保存,相当于复制文件了。

int iSFileHandle; //源文件句柄
int iDFileHandle; //目标文件句柄
long lFileLength; //文件长度
char* cpBuffer; //存文件内容的缓冲区

//以只读方式打开文件
iSFileHandle = FileOpen("c:\\a.txt", fmOpenReadWrite);

//得到文件长度,并将文件指针指向文件头
lFileLength = FileSeek(iSFileHandle,0,2);
FileSeek(iSFileHandle,0,0);

//为缓存分配空间,并读取全部文件
cpBuffer = new char[lFileLength];
FileRead(iSFileHandle, cpBuffer, lFileLength);

//建立新文件,并将缓冲区内容存入新文件
iDFileHandle = FileCreate("c:\\b.txt");
FileWrite(iDFileHandle, cpBuffer, lFileLength);

//关闭文件
FileClose(iSFileHandle);
FileClose(iDFileHandle);

//释放缓冲区空间
delete cpBuffer;
zt03001309 2004-10-21
  • 打赏
  • 举报
回复
是啊,我在解析小文件时就没有问题,内存也挺大的啊,要怎么内存映射文件啊?请指教一下吧
类库 2004-10-20
  • 打赏
  • 举报
回复
用内存映射文件吧
huabihan 2004-10-20
  • 打赏
  • 举报
回复
一般用TSTRINGLIST读取和写文本文件最大的大概有6、7万多行,文件大小有达到7M左右,所以大小应该没问题,难道是内存不足??我没试过用那么大的文本文件读取,小文件是可以!~!~

13,825

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧