什么时候应该使用endfile,在阅读之前或之后?

时间:2014-06-16 15:07:42

标签: vhdl

在查找从文件中读取文本的示例(使用readlineread)时,我会不断看到如下代码,但却找不到具体信息{{1确实。

endfile

在我所知道的所有其他语言中,文件结尾将在从文件中读取行后检查,而不是之前。

while not endfile(in_file) loop readline(in_file, in_line); read(in_line, in_data); end loop; 的语义究竟是什么使这种用法正确?

3 个答案:

答案 0 :(得分:1)

来自IEEE VHDL标准:

  

3.4.1文件操作...功能ENDFILE返回FALSE   如果对访问模式为只读的打开文件对象的后续READ操作可以从文件中检索另一个值;否则,它返回TRUE。

因此,在从文件中读取之前检查endfile是正确的,因为只要可以读取另一个值/行,endfile就会返回false

答案 1 :(得分:0)

有几种语言使用eof函数或语句来确定文件的结尾。这些语言或库没有特殊的返回值(-1,null,nil,...)甚至是异常机制来报告失败的读取(...),所以在这种情况下,它必须在读取之前测试eof(。 。)并证明另外一个读(...)不会使程序崩溃。

编辑1

zennehoy要求提供一些使用这种EOF语句/功能的语言示例:

示例1:QBasic

open "file.txt" for input as #1
do until eof(1)
  input #1,name$,street$, ...
loop
close #1

示例2:Windows Scripting Host(WSH),别名VBA,别名VB脚本:

do until fileHandle.atEndOfStream
  [...]
loop

示例3:如果我没记错的话,这将是Pascal

Ansi-C还有一个eof功能,但在很多情况下它没有必要使用它,因为你可以确定文件的结尾,如果read(..)返回的字节数少于请求的字节数。

但是如果您正在读取streams / pipes / ...这将无法正常工作,因为read可以返回更少的字节,并且在几毫秒之后有更多的字节,您可以再次读取。对EOF的测试将向您保证,流上的作者已关闭。

答案 2 :(得分:0)

首先测试文件结束状态的另一个示例语言是Ada while not End_Of_File loop,其中End_Of_File是包Ada.Text_IO中的函数,默认值为它是File_Mode类型的单个参数是In_file。从Ada95开始,End_Of_File仅对模式In_FileInout_File的文件进行操作,否则会生成异常。 (虽然endfile将在VHDL中为WRITE_MODE返回FALSE)。

早期的VHDL实现包括Ada的预处理器。您可以看到整个LRM的影响力。例如,位位置和整数值之间没有耦合或浮点格式的描述。这些恰好允许VHDL在具有原生十进制ALU的计算机上运行。