File io 如何在VHDL中从一行中读取元素?

File io 如何在VHDL中从一行中读取元素?,file-io,vhdl,File Io,Vhdl,我正在尝试使用VHDL来读取具有不同格式的文件。我知道您应该使用以下两行代码一次读取一行,读取该行中的单个元素 readline(file, aline); read(aline, element); 然而,我的问题是,read(aline,element)将返回到element中的是什么?如果该行为空,它将返回什么?如果我用了5次,我的行只有4个字符,它会返回什么 我想知道的原因是,如果我正在读取一个在有效数据之间有任意数量空格的文件,我如何解析这个有效数据 任何帮助都将不胜感激 编辑: 由

我正在尝试使用VHDL来读取具有不同格式的文件。我知道您应该使用以下两行代码一次读取一行,读取该行中的单个元素

readline(file, aline);
read(aline, element);
然而,我的问题是,read(aline,element)将返回到element中的是什么?如果该行为空,它将返回什么?如果我用了5次,我的行只有4个字符,它会返回什么

我想知道的原因是,如果我正在读取一个在有效数据之间有任意数量空格的文件,我如何解析这个有效数据

任何帮助都将不胜感激

编辑:

由于我所描述的文件格式在问题中并不完全清楚,我总结了我在下面对我收到的一些答案的评论中所作的澄清

该文件包含由任意数量的空格(任意数量的空格、制表符或新行)分隔的ASCII字符。如果该行以#开头,则该行为注释,应忽略

在这些注释之外,文件的第一部分包含的字符仅是大小可变的字母或数字组合。换言之:

123           ABC   12ABB3 
但是,大多数文件(在读取一定数量的字之后)将纯粹是任意长度的数字,由任意数量的空白分隔。换句话说,文件的第二部分是:

255 0       2245   625         430
2222  33        111111

我必须能够单独解析这些数字(并解释它们)

如评论中所述,
std.textio
ieee.std\u logic\u textio
中的所有
read
过程都跳过了
字符
字符串
版本之外的前导空格(因为空格与其他任何字符一样多)

您可以测试
变量(缓冲区)是否为空,如下所示:

if L'length > 0 then
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
是您的
变量。还有一组重载的
read
过程,具有额外的状态输出:

procedure read (L    : inout LINE;
                VALUE: out   <type> ;
                GOOD : out   BOOLEAN);
L
现在位于字符串
S
中。然后可以编写一些代码来解析它。您可能会发现type属性
的值
很有用。这会将字符串转换为某种类型,例如

variable I : integer;
...
I := integer'value(S(12 to 14));
将整数
I
设置为字符串
S
的元素12到14中包含的值

下面user1155120建议的另一种方法是查看缓冲区中的值,例如

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

参见IEEE Std 1076-2008 16.4文件包TEXTIO,第8段(部分),为字符和字符串以外的给定类型定义的读取过程以跳过前导空白字符开始。空白字符定义为空格、不间断空格或水平制表字符(SP、NBSP或HT)。对于所有读取过程,将从L中删除字符,并将其合成为指定类型值的字符串表示形式(请参见5.7)。如何联机访问此内容?看,是的,我查过如何通过IEEE购买,但我买不起。一种语言的参考手册不应该免费提供吗?这有点可笑。可能是重复的。非常感谢你的回复!那么,我如何知道设置变量的类型呢?我希望能够忽略空白字符,但同时不是我读到的每一行都只有用空白分隔的数字(尽管它们中的大多数都是)。换句话说,我正在读取一个具有可变格式的文件。该文件可能有注释(以#字符开头的行),并且在极少数情况下,该文件也可能有字母。尽管该文件大部分由数字组成,中间有任意数量的空格。你的评论表明你的问题不清楚。这意味着可以对aline访问的值进行解析(描述行)。8.3选定名称对于用于表示访问值指定的对象的选定名称,后缀应为保留字all。前缀应属于访问类型。您可以忽略以“#”开头的行或以其他方式描述行的内容。对不起,我想问的是,如何知道将传递给read()函数的变量设置为哪种类型?考虑到我描述的文件的组成,我希望能够解析由空格分隔的元素,但知道这些元素可能不是同一类型的。如果我使用read(aline,element),我应该制作什么类型的变量元素?顺便说一句,我衷心感谢您的回答,我周一有一个作业要交,占我成绩的20%,班上没有助教或懂VHDL的教授,所以我们完全靠自己。我想我唯一的选择是单独阅读每个字符,并根据我想如何解析数据来决定如何处理它?