【问题标题】:Pascal WriteLn failing帕斯卡 WriteLn 失败
【发布时间】:2013-01-17 10:11:48
【问题描述】:

我正在帕斯卡为学校做一个小项目。 我正在使用 Lazaruz 1.0.2

写入文件时,wirteLn 函数出现问题。 一段时间后,它会停止写入文件。

以这个程序为例:

var oFile: Text;
  i: LongWord;
begin
  Assign(oFile, 'test.txt');
  ReWrite(oFile);
  for i:=1 to 4096 do
  WriteLn(oFile, 'ThisIsTest');
  CloseFile(oFile);//Added as suggested
end.

这是输出:

...
4072 ThisIsTest
4073 ThisIsTest
4074 ThisIsTest
4075 ThisIsTe

如您所见,它只是停在句子的中间,并没有全部写完。 这一切都取决于一个 WriteLn 指令有多长以及它被调用了多少次。

如何解决?

我尝试使用名为 WriteFile 的“Windows”模块中的 WinApi 函数,但未能将最后 3 个参数传递给它。


重大更新

谢谢。在该示例中有效(关闭文件)。但是我有一些更复杂的程序,我将打开的文件句柄传递给通过“var”写入它的函数。即使在关闭该文件之后,并且什么也不做。很奇怪。

【问题讨论】:

  • 这是 1997 年稳定的功能。如果复杂的场景仍然失败,则必须有另一个错误。继续简化直到问题消失。那么你有一个公平的机会,你的最后一次更改与错误的地方有关。
  • @MarcovandeVoort 一直以来我都无法修复它。但这是我一生中将看到的最后一个 Pascal 项目。我什至尝试使用 Winapi 函数写入文件,但 Pascal 不可能将 NULL、NIL 或 0 作为参数传递。也因此无法使用winapi函数WriteFile。

标签: pascal freepascal lazarus


【解决方案1】:

您应该在程序结束时Close(oFile) 以确保刷新输出。

【讨论】:

  • 我忘记了。但这并没有改变任何东西。
  • 刚刚在这里测试过(fpc 2.6.0):它确实解决了你的问题。你确定你已经正确地重新编译了程序吗?
  • 谢谢。这在那个例子中有效。但是我有一些更复杂的程序,我通过“var”将打开的文件句柄传递给函数。甚至在 and 处关闭该文件什么也不做。很奇怪。
【解决方案2】:

也可以在不关闭文件的情况下通过添加(在本例中)来更新文件

Flush(oFile); 写完之后

这在您可能有一个很长的文件并希望确保它定期更新时很有用。当然,完成后你还是应该关闭文件。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-27
    相关资源
    最近更新 更多