我有一个数据文件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;  

解决方案 »

  1.   

    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;楼主,你的循环是不是有点问题呢?
      

  2.   

    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; 
    我想问题就出在这两个地方吧??
      

  3.   

    While not eof(f) do
      begin
        While not eoln(f) do
    应该是:
      While not eof(f) do
      begin
        While not eoln(f1) do             吧?
      

  4.   

    1、我想ReSet(f);的作用就是将文件的起始位置设置为文件头‘
    2、“没有读取下一行操作”:我也怀疑这个问题,本来While not eof(f) do就是希望一直读到文件尾,但读到第一行尾时eoln(f)为真,这样结束这个While块执行Writef1,#13,#10);然后回到第一个While块,从而又读第二行,但此时eoln(f)是否仍为真呢?我想应该不是,因为已经读了第二行的第一个数了,而且如果是的话那就应该整个文件只读了一行,不该写出几百兆的文件(原数据文件不过几百K);
      

  5.   

    试试下面的代码:
    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;  
      

  6.   

    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)
      

  7.   

    这样就可以了。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;
      

  8.   

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