在线等候:简单的文件读写问题。

lpa 2003-09-29 10:51:30
我有一个数据文件fex211yd.dat,想把它的数据变成六位(不足六位以空格补齐)
写到文件fex211yd.txt中。但好象程序进入了死循环而使得写出来的文件有几百兆。
请大家看看程序有何错误:
procedure TForm1.Button1Click(Sender: TObject);
var
f,f1:TextFile;
i:Integer;
begin
AssignFile(f,'d:\2004hs\fxx\fex211yd.dat');
AssignFile(f1,'d:\2004hs\fxx\fex211yd.txt');
ReSet(f);
ReWrite(f1);
While not eof(f) do
begin
While not eoln(f) do
begin
Read(f,i);
Write(f1,Format('%6D',[i]));
end;
Write(f1,#13,#10);
end;
CloseFile(f);
CloseFile(f1);
end;
...全文
28 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
things 2003-09-29
  • 打赏
  • 举报
回复
Read(f,i)读的是一行!
你试试

While not eof(f) do
begin
Read(f,i);
Write(f1,Format('%6D',[i]));
Write(f1,#13,#10);
end;

要求 .dat 文件每行不超过6位数字(%6D)
snowfog 2003-09-29
  • 打赏
  • 举报
回复
试试下面的代码:
procedure TForm1.Button1Click(Sender: TObject);
var
f,f1:TextFile;
i:Integer;
begin
AssignFile(f,'d:\2004hs\fxx\fex211yd.dat');
AssignFile(f1,'d:\2004hs\fxx\fex211yd.txt');
ReSet(f);
ReWrite(f1);
While not eof(f) do
begin
While not eoln(f) do
begin
Read(f,i);
Write(f1,Format('%6D',[i]));
end;
Readln(f,i);//试试看
Write(f1,#13,#10);
end;
CloseFile(f);
CloseFile(f1);
end;
lpa 2003-09-29
  • 打赏
  • 举报
回复
另外我忘了说的:写出来的文件只有头一行是与原数据文件一样的数据,其他全是空行。
lpa 2003-09-29
  • 打赏
  • 举报
回复
1、我想ReSet(f);的作用就是将文件的起始位置设置为文件头‘
2、“没有读取下一行操作”:我也怀疑这个问题,本来While not eof(f) do就是希望一直读到文件尾,但读到第一行尾时eoln(f)为真,这样结束这个While块执行Writef1,#13,#10);然后回到第一个While块,从而又读第二行,但此时eoln(f)是否仍为真呢?我想应该不是,因为已经读了第二行的第一个数了,而且如果是的话那就应该整个文件只读了一行,不该写出几百兆的文件(原数据文件不过几百K);
WuLoveXue 2003-09-29
  • 打赏
  • 举报
回复
While not eof(f) do
begin
While not eoln(f) do


应该是:
While not eof(f) do
begin
While not eoln(f1) do 吧?
upingking 2003-09-29
  • 打赏
  • 举报
回复
procedure TForm1.Button1Click(Sender: TObject);
var
f,f1:TextFile;
i:Integer;
begin
AssignFile(f,'d:\2004hs\fxx\fex211yd.dat');
AssignFile(f1,'d:\2004hs\fxx\fex211yd.txt');
ReSet(f);
ReWrite(f1);
While not eof(f) do//没有文件的起始位置
begin
While not eoln(f) do
begin
Read(f,i);
Write(f1,Format('%6D',[i]));
end;

Write(f1,#13,#10);
//没有读取下一行操作
end;
CloseFile(f);
CloseFile(f1);
end;
我想问题就出在这两个地方吧??
IORILI 2003-09-29
  • 打赏
  • 举报
回复
肯定是循环有问题了
rwdx 2003-09-29
  • 打赏
  • 举报
回复
你的i在哪里赋值的?
rwdx 2003-09-29
  • 打赏
  • 举报
回复
While not eof(f) do
begin
While not eoln(f) do
begin
Read(f,i);
Write(f1,Format('%6D',[i]));
end;
Write(f1,#13,#10);
end;

楼主,你的循环是不是有点问题呢?
IORILI 2003-09-29
  • 打赏
  • 举报
回复
帮你up
laurecn 2003-09-29
  • 打赏
  • 举报
回复
跟踪下看看什么地方出现的死循环
lpa 2003-09-29
  • 打赏
  • 举报
回复
这个问题我想分两个方面:
第一是我的具体要求是将某文件里的数据写成每个数据6位(这样用记事本等编辑时就整齐好看),这个实现起来应该不难,但我上述代码却出了问题;后来我把While..do循环换成了Repeat..until循环就解决了;
第二是:即便我的具体问题解决了,但为什么这段代码出问题,我还是想弄清楚,因此暂不结帖,欢迎继续讨论,分数照给;
我在改用Repeat..until循环后发现:原数据文件中有的行尾部有多余空格,造成写出来的文件行数与原数据文件行数不同。但这不是原方法出问题的原因,因为我把行尾多余空格全去掉后用原的方法或楼上的楼上所说发方法都不行。还有遇到eof时已经往目标文件多写了一个i值。
DY2003 2003-09-29
  • 打赏
  • 举报
回复
楼上的应该可以了!
jinkang 2003-09-29
  • 打赏
  • 举报
回复
这样就可以了。

procedure TForm1.Button1Click(Sender: TObject);
var
f,f1:TextFile;
i:Integer;
begin
AssignFile(f,'e:\tmp\r1.dat');
AssignFile(f1,'e:\tmp\w1.dat');
ReSet(f);
ReWrite(f1);
While not eof(f) do
begin
{
While not eoln(f) do
begin
Read(f,i);
Write(f1,Format('%6D',[i]));
end;
}
Readln(f,i);//试试看
Write(f1,Format('%6D',[i])+#13#10);
end;
CloseFile(f);
CloseFile(f1);
end;

5,388

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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