在仿真过程中,我需要获取Vivado中文本文件的长度。我尝试使用下面的代码,但出现错误。
file my_input : TEXT open READ_MODE is "/home/sukru/MD5.dat";
variable my_line : LINE;
variable input_line : LINE;
variable length : integer;
readline(my_input, input_line);
read(input_line, length);
writeline(output, input_line); -- optional, write to std out
write(input_line, integer'(length));
writeline(output, input_line);
错误消息是这样的。
Error: TEXTIO function READ: read a non-integer, an integer is expected
a
-2147483648
我可以读取文本的索引,但长度是无意义的值。有人指导我如何获取任何文本文件的长度。
答案 0 :(得分:0)
此行从文件中读取一行:
readline(my_input, input_line);
此行尝试(破坏性地)从该行读取一个整数:
read(input_line, length);
它不返回文件(或行)的长度。您没有提供您要读取的文件(这样做会更好-请参见this),但是我的猜测是它不包含整数,因此不包含错误消息。 / p>
如果要获取任何文本文件的长度,则需要读取文件中的每一行,找到每行的长度并添加它们。很容易找到每行的长度,因为类型line
确实具有'length
属性,所以每行的长度为:
input_line'length
顺便说一句,此行不会显示您刚刚阅读的内容,因为读取(如果成功)是破坏性的:
writeline(output, input_line); -- optional, write to std out
(“破坏性读取”是一种既删除数据又读取数据的读取。)
答案 1 :(得分:0)
VHDL目前无法与主机操作系统接口以确定文件长度。
字节和VHDL类型字符之间是等效的(请参阅IEEE Std 1076-2008)。
...
ISO / IEC 8859-1:1998,信息技术-8位单字节编码图形字符集-第1部分:拉丁字母1。
另请参见16.3程序包标准,键入字符,其中包括单字节字符的所有256个枚举值。
这意味着我们可以计算文件中的字符:
use std.textio.all;
entity length_in_bytes is
end entity;
architecture foo of length_in_bytes is
impure function file_length (file_name: string) return integer is
type char_file is file of character;
file file_in: char_file open read_mode is file_name;
variable char_buffer: character;
variable length: integer := 0;
begin
while not ENDFILE(file_in) loop
read(file_in, char_buffer);
length := length + 1;
end loop;
file_close(file_in);
-- report file_name & " length = " & integer'image(length);
return length;
end function;
signal filelength: natural;
begin
filelength <= file_length("md5.dat");
process
begin
wait for 0 ns; -- skip default signal value;
report "file md5.dat length = " & integer'image(filelength);
wait;
end process;
end architecture;
函数调用返回的长度将与主机操作系统提供的长度匹配。
file_close使文件处于未锁定状态以备将来使用,并且从打开文件开始依次读取打开的文件。