我尝试使用VHDL从可能具有不同格式的文件中读取。我知道你应该使用以下两行代码一次读取一行,读取该行中的各个元素。
readline(file, aline);
read(aline, element);
但是我的问题是什么会读(aline,element)返回元素?如果线是空的,它会返回什么?如果我使用过它会有什么回报让我说5次,我的行只有4个字符?
我想知道的原因是,如果我正在读取有效数据之间有任意数量空格的文件,我该如何解析这些有效数据?
任何帮助都将不胜感激。
编辑:
由于我所描述的文件格式在问题中并未完全清楚,因此我总结了我在评论中对我在下面收到的一些答案所做的澄清。
该文件包含由任意数量的空格(任意数量的空格,制表符或新行)分隔的ASCII字符。如果该行以#开头,该行是注释,应该被忽略。
在这些注释之外,文件的第一部分包含仅包含可变大小组合的字母或数字的字符。换句话说:
123 ABC 12ABB3
然而,大多数文件(在一定数量的读取单词之后)将是任意长度的纯数字,由任意数量的空白区分开。换句话说,文件的第二部分是:
255 0 2245 625 430
2222 33 111111
我必须能够分别解析这些数字(并解释它们)。
答案 0 :(得分:3)
正如评论中所述,read
和std.textio
中的所有ieee.std_logic_textio
程序都会跳过除character
和string
版本之外的前导空格(因为空间和任何其他空间一样多。
您可以测试line
变量(缓冲区)是否为空:
if L'length > 0 then
其中L
是您的line
变量。还有一组带有额外状态输出的重载read
过程:
procedure read (L : inout LINE;
VALUE: out <type> ;
GOOD : out BOOLEAN);
额外输出 - GOOD
- 如果读取成功则为true
,如果不是false
则为std.textio
。这些优点如果读取不成功,则模拟不会停止(与常规程序一样)。此外,对于ieee.std_logic_textio
中的版本,如果读取不成功,则读取是非破坏性的(即,您尝试读取的任何内容仍保留在缓冲区中)。但是,variable S : string(1 to <some big number>);
...
readline(F, L);
assert L'length < S'length; -- make sure S is big enough
S := (others => ' '); -- make sure that the previous line is overwritten
if L'length > 0 then
read(L, S(1 to L'length);
end if;
中的版本不是这种情况。
如果你真的不知道你想要读什么格式,你可以将整行读成一个字符串,如下所示:
L
行S
现在位于字符串'value
中。然后,您可以编写一些代码来解析它。您可能会发现 type属性 variable I : integer;
...
I := integer'value(S(12 to 14));
很有用。这会将字符串转换为某种类型,例如
I
将整数S
设置为字符串if L'length > 0 then -- check that the L isn't empty, otherwise the next line blows up
if L.all(1) = '#' then
-- the first character of the line is a '#' so the line must be a comment
的元素12到14中包含的值。
下面的user1155120建议的另一种方法是查看缓冲区中的值,例如
HtmlEmailInput