读入大于1M的文本文件的问题(100分)

  • 主题发起人 主题发起人 toxing
  • 开始时间 开始时间
T

toxing

Unregistered / Unconfirmed
GUEST, unregistred user!
我需要将一个3M多的文本文件读入到数据库中,操作很简单,读、写就行。
该程序读3M的文件时,第一次读到1M左右就停了,
以后更绝,第一次readln时就将所有文本读到串instr里了!(我单步运行时看的)
根本没管其中有回车换行符。
但如果我将其中的头几行单独复制成一个新文件,读入都没问题。
难道这是Delphi的BUG?我用的是Delphi5+win2000
程序如下:
var MsgFile:textfile

assignfile(MsgFile,newfile);
reset(MsgFile);
while not eof(MsgFile) do
begin
readln(MsgFile,instr);
// 插入数据库
....
end;
closefile(MsgFile);
 
是不是有非法字符?
 
应该没有,我用ultraedit看了16进制码(当然只看了头几行)。回车换行都是正确的。
而且单独读取头几行都没问题啊。
 
用TStringList试试:
var
i: Integer;
with TStringList.Create do
begin
try
LoadFromFile(newfile);
for i := 0 to Count - 1 do
begin
//插入数据库Strings代表一行
....
end;
finally
Free;
end;
end;
 
不可能呀?这两天我一直用Textfile,没有问题。
全部源码贴出来(如果较大的话,你email过来我看看,savenight@sohu.com)
 
你贴出来的程序就不应该有问题,可能是其他有方的问题!
 
相关的程序为,其它的操作与读文件无关了,我就不贴了。但在跟踪时,
我发现第一次readln时将所有文本读到串instr里了,而且instr里每行的分隔符成了#$A,
也就是说回车符没了!但该文件我是用writeln生成的,ultraedit里看的也确实有#$D啊!
var
MsgFile:textfile;
sMsgFile,inStr:string;
begin
//修改文件名
newfile:=sMsgFile+formatdatetime('yyyymmddhhnnss',now);
Renamefile(sMsgFile,newfile);
//读文件
assignfile(MsgFile,newfile);
reset(MsgFile);
try
while not eof(MsgFile) do
begin
readln(MsgFile,instr);
// 插入数据库
....
end;
closefile(MsgFile);
end;
 
sygzch的是一个好主意,何必调用系统层文件函数?
 
就算是没了#$D,也不会readln读出几行的数据。
你给出的代码没问题。
 
sygzch的办法我试过了,可行。但难道readln真的有问题吗?loadfromfile应该也是调用
这些系统文件函数的吧?
 
我把10G的文件都这磁读出来并写到数据库中了,应该没什么问题,换个文件试试,设置断
点跟踪一下;
实在不行给我发个E_mail,我给你E一个;
wyh919@21cn.com
 
多人接受答案了。
 
后退
顶部