在查找从文件中读取文本的示例(使用readline
和read
)时,我会不断看到如下代码,但却找不到具体信息{{1确实。
endfile
在我所知道的所有其他语言中,文件结尾将在从文件中读取行后检查,而不是之前。
while not endfile(in_file) loop
readline(in_file, in_line);
read(in_line, in_data);
end loop;
的语义究竟是什么使这种用法正确?
答案 0 :(得分:1)
来自IEEE VHDL标准:
3.4.1文件操作...功能ENDFILE返回FALSE 如果对访问模式为只读的打开文件对象的后续READ操作可以从文件中检索另一个值;否则,它返回TRUE。
因此,在从文件中读取之前检查endfile
是正确的,因为只要可以读取另一个值/行,endfile
就会返回false
。
答案 1 :(得分:0)
有几种语言使用eof函数或语句来确定文件的结尾。这些语言或库没有特殊的返回值(-1,null,nil,...)甚至是异常机制来报告失败的读取(...),所以在这种情况下,它必须在读取之前测试eof(。 。)并证明另外一个读(...)不会使程序崩溃。
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_File
或Inout_File
的文件进行操作,否则会生成异常。 (虽然endfile
将在VHDL中为WRITE_MODE返回FALSE)。
早期的VHDL实现包括Ada的预处理器。您可以看到整个LRM的影响力。例如,位位置和整数值之间没有耦合或浮点格式的描述。这些恰好允许VHDL在具有原生十进制ALU的计算机上运行。