4

以下是一个简单的控制台应用程序,然后生成十组 3 个随机数并将它们打印到控制台窗口和文本文件“Output.txt”。

program Project1;

{$APPTYPE CONSOLE}

{$R *.res}

uses
  System.SysUtils;
var
  outputFile: TextFile;
  i: Integer;
  a,b,c: Single;
begin
  try
    Randomize;
    AssignFile(outputFile, 'Output.txt');
    ReWrite(outputFile);
    for i := 0 to 9 do
    begin
      a := Random;
      b := Random;
      c := Random;
      WriteLn(FloatToStr(a) + Char(9) + FloatToStr(b) + Char(9) + FloatToStr(c));
      WriteLn(outputFile, FloatToStr(a) + Char(9) + FloatToStr(b) + Char(9) + FloatToStr(c));
    end;
    Close(outputFile);
    Sleep(10000);
  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;
end.

仅当我包含第 26 行时,文本文件才包含与控制台窗口相同的信息:

关闭(输出文件);

如果我从代码中省略了这一点,我希望无论如何都会将相同的数据打印到文本文件中,但文本文件中实际打印的内容对于前 9 行是相同的,然后是不完整的最后一行。

为什么会这样?由于省略了 Close 过程,最后一行通过什么过程仅部分写入?

4

1 回答 1

11

这是因为文件输出被缓冲造成的。当你关闭文件时,它会导致缓冲区被刷新,剩余的内容被放到磁盘上。

Flush(outputFile)另一种方法是在文件之后执行一个WriteLn,它会完成同样的事情,但会牺牲性能。

于 2013-01-29T13:31:02.193 回答