4

以下は単純なコンソール アプリケーションで、3 つの乱数を 10 セット生成し、コンソール ウィンドウとテキスト ファイル '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)別の方法は、ファイルに対してafterを実行するWriteLnことです。同じことを実行できますが、パフォーマンスが犠牲になります。

于 2013-01-29T13:31:02.193 に答える