var
Wave1ReceBuf:array[0..30000]of word;
Wave2ReceBuf:array[0..30000]of word;
.
.
procedure TForm1.Button1Click(Sender: TObject);
var
MyFile:TMemoryStream;
iLen:Int64;
Begin
If savedialog1.Execute then
begin
iLen:=0;
MyFile:=TMemoryStream.Create;
MyFile.SavetoFile(opendialog1.FileName);
iLen:=MyFile.Size;//获得指定TXT文件的大小
SetLength(FileBuf,iLen);//设置动态数组的长度为TXT文件的大小
MyFile.writeBuffer(Wave1ReceBuf[0],iLen);//写入TXT文件全部数据
MyFile.writeBuffer(Wave2ReceBuf[0],iLen);//写入TXT文件全部数据
FreeAndNil(MyFile);
end;
end; procedure TForm1.Button2Click(Sender: TObject);
var
MyFile:TMemoryStream;
iLen:Int64;
Begin
If opendialog1.Execute then
begin
iLen:=0;
MyFile:=TMemoryStream.Create;
MyFile.LoadFromFile(opendialog1.FileName);
iLen:=MyFile.Size;//获得指定TXT文件的大小
SetLength(FileBuf,iLen);//设置动态数组的长度为TXT文件的大小
MyFile.ReadBuffer(Wave1ReceBuf[0],iLen);//读取TXT文件全部数据
MyFile.ReadBuffer(Wave2ReceBuf[0],iLen);//读取TXT文件全部数据
FreeAndNil(MyFile);
end;
end;
总感觉不对,如果我想保存为txt文件,然后读出数据后,还要转换,strtoint().比如两个缓冲,怎么识别呢?
Wave1ReceBuf:array[0..30000]of word;
Wave2ReceBuf:array[0..30000]of word;
.
.
procedure TForm1.Button1Click(Sender: TObject);
var
MyFile:TMemoryStream;
iLen:Int64;
Begin
If savedialog1.Execute then
begin
iLen:=0;
MyFile:=TMemoryStream.Create;
MyFile.SavetoFile(opendialog1.FileName);
iLen:=MyFile.Size;//获得指定TXT文件的大小
SetLength(FileBuf,iLen);//设置动态数组的长度为TXT文件的大小
MyFile.writeBuffer(Wave1ReceBuf[0],iLen);//写入TXT文件全部数据
MyFile.writeBuffer(Wave2ReceBuf[0],iLen);//写入TXT文件全部数据
FreeAndNil(MyFile);
end;
end; procedure TForm1.Button2Click(Sender: TObject);
var
MyFile:TMemoryStream;
iLen:Int64;
Begin
If opendialog1.Execute then
begin
iLen:=0;
MyFile:=TMemoryStream.Create;
MyFile.LoadFromFile(opendialog1.FileName);
iLen:=MyFile.Size;//获得指定TXT文件的大小
SetLength(FileBuf,iLen);//设置动态数组的长度为TXT文件的大小
MyFile.ReadBuffer(Wave1ReceBuf[0],iLen);//读取TXT文件全部数据
MyFile.ReadBuffer(Wave2ReceBuf[0],iLen);//读取TXT文件全部数据
FreeAndNil(MyFile);
end;
end;
总感觉不对,如果我想保存为txt文件,然后读出数据后,还要转换,strtoint().比如两个缓冲,怎么识别呢?
TStrItem=Record
index:integer;//索引,相当于等号前面的1
Length:integer;//内容长度,相当于6422*17014的字符串长度
str:string;//字符串的内容
end;TStr=Record
StrItemCount:integer;//数组的数量
item:array of TStrItem;
end;
在使用的时候,创建这个结构,然后进行读写操作,具体方法如下:
写入流:
1,先写入StrItemCount;
2,然后使用循环写入item内容,每个item内容,先写index,在写Length,最后写str。
读取的时候是关键,这样读取:
1,先读入sizeof(integer)长度的流数据,这个就是StrItemCount的数值,根据这个数值循环读取item内容;
2,每个item内容这样读取:(1)先读取sizeof(integer)长度的数据,为index的内容;(2)再读取sizeof(integer)长度的数据,为后面真正字符串的内容长度;(3)最后根据长度,读取这个长度的数据,就是str的内容了;
3,通过循环,数据就读出来了。别的结构,你根据这个思路,自己组织了
使用=后的数据可以用
s:=rightstr(stringlist.strings[i],pos('=',stringlist.strings[i],));
读取大文本文件,比如几十兆以上的时候建议使用流读取快,小文件用stringlist就够用了。
你试试,没那么麻烦!
我之前是Iinifile读去的。一行一行的读,所以打开文件的时候很慢
现在就是想用流来做,感觉挺模糊的,肯请大家指点!
List:TStringList;
i,p:Integer;
s:string;
begin
List:=TStringList.Create;
List.LoadFromFile(' ');
for i:=0 to List.Count-1 do
begin
s:=List.ValueFromIndex[i];
p:=Pos('*',s);
ShowMessage(Copy(s,1,p-1)+' '+Copy(s,p+1,1000));
end;
List.Free;
end;
用TIniFile读的,后来在使用过程中发现当数据稍微大一点的时候,读出的速度特别慢。现在
我想用流来读写,不用保存成TXT文本文件,只要求能顺利读出就可以了!TO:stherix :这样读数据跟ini读速度应该是差不多的吧
我的数据大概几百k到1m,或者再大点!
谢谢各位的参与哦!
同意11楼的写法。
s:=rightstr(stringlist.strings[i],length(stringlist.strings[i])-pos('=',stringlist.strings[i],));
其实就是用流实现的,你可以看源代码
几百K,几M的文件很小的
比如说for i:=0 to 3000000 do
wave1recebuffer[i]=inc(i)
var
MyFile:TMemoryStream;
iLen:Int64;
Begin
If savedialog1.Execute then
begin
iLen:=0;
MyFile:=TMemoryStream.Create;
MyFile.SavetoFile(opendialog1.FileName);
iLen:=MyFile.Size;//获得指定TXT文件的大小 这里永远为0,因为没有载入文件。
SetLength(FileBuf,iLen);//设置动态数组的长度为TXT文件的大小 请注意你的数组没有动态定义,你这样写是画蛇添足
MyFile.writeBuffer(Wave1ReceBuf[0],iLen);//写入TXT文件全部数据
MyFile.writeBuffer(Wave2ReceBuf[0],iLen);//写入TXT文件全部数据
FreeAndNil(MyFile);
end;
end;
再看看你第二段:procedure TForm1.Button2Click(Sender: TObject);
var
MyFile:TMemoryStream;
iLen:Int64;
Begin
If opendialog1.Execute then
begin
iLen:=0;
MyFile:=TMemoryStream.Create;
MyFile.LoadFromFile(opendialog1.FileName);
iLen:=MyFile.Size;//获得指定TXT文件的大小
SetLength(FileBuf,iLen);//设置动态数组的长度为TXT文件的大小
下面的读取是什么意思呢?流指针在哪呢?读什么呢?我看不明白。如果在首部,我还是头一次见到把数据流写在文件头部的。
MyFile.ReadBuffer(Wave1ReceBuf[0],iLen);//读取TXT文件全部数据
MyFile.ReadBuffer(Wave2ReceBuf[0],iLen);//读取TXT文件全部数据
FreeAndNil(MyFile);
end;
end;
另外,你为什么要用ReadBuffer呢?用它的话必须要有try,否则你就不要用它。
那只是抛砖引玉啊,嘿嘿。。
我试了前几楼的方法。用Tsringlist读出文件,确实要快的多
,基本够用。可是又有问题了。内存用的很多,偶尔还出现内存泄露!
我知道问题出在内存没有释放。可具体怎么做,还在找方法
再次感谢大家热情相助
ok,没问题。现在就加分,就当给大家拜拜年!