Systemverilog 文件I/O小结

2023-05-16

一、文件打开和关闭
fopen和fclose操作:
在这里插入图片描述
不同的type含义:
在这里插入图片描述
二、文件内容扫描
从文件中读取内容:
在这里插入图片描述
$fgetc每次读取一个字符(8bits);
$fgets每次读取一行里的部分或者全部内容,用作字符串输出,每次读的内容的bit数目或多少取决于str的大小(有多少bit);
在这里插入图片描述
$fscanf从读文件中读取内容,按给定的格式输出;
在这里插入图片描述
$fread用于从文件读取二进制数据,每次读取的数据位宽或者多少取决于integral_var的大小(有多少bit);
在这里插入图片描述
三、文件定位
在这里插入图片描述
四、文件内容输出
$fflush
将写buffer的内容(需要写出的内容),一次性写到文件里;如果没有指定文件,将会写到所有打开的文件中。
在这里插入图片描述
在这里插入图片描述
五、文件尾判断
$feof:检测文件结束标志EOF,这个使用的时候需要注意,遇到过类似的问题:
使用while循环判断EOF,结果进入死循环:
C语言中的案例:https://bbs.csdn.net/topics/90228351
SV中的案例:https://verificationacademy.com/forums/systemverilog/systemverilog-feof#question-30384

while(! $feof(f1) && ! $ferror(f1))的使用方法如果底下接的是%fscanf的时候容易出现死循环的问题,譬如:
while(! $feof(f1) && ! $ferror(f1))
a = $fscanf(f1,"%d",&al)
能读出第一个整数,但读到字符时就出现死循环。fscanf(f1,"%d",&al)读到字符的时候,因为读取不到整数,文件指针不会往下走的。所以while(! $feof(f1) && f e r r o r ( f 1 ) ) 一 直 为 真 , 进 入 死 循 环 。 这 种 情 况 下 一 般 使 用 ferror(f1)) 一直为真,进入死循环。这种情况下一般使用 ferror(f1))使fgets或者$fread可以避免这样的问题。

还有看到过用feof判断while循环多读一次的问题:
这里有案例:https://blog.csdn.net/woaisia/article/details/46441449
运行如下程序:
char c;
while(!feof(fp))
{
c = fgetc(fp);
printf("%X/n", c);
}
会发现多输出了一个FF,原因就是在读完最后一个字符后,fp->flag仍然没有被置为_IOEOF,因而feof()仍然没有探测到文件结尾。直到再次调用fgetc()执行读操作,feof()才能探测到文件结尾。这样就多输出了一个-1(即FF)。

正确的写法应该是:
char c;
c = fgetc(fp);
while(!feof(fp))
{
printf("%X/n", c);
c = fgetc(fp);
}

while(!feof(fp))是判断的前一次从文件中读取的字符,所以在最后一个字符那里,读取打印出来,再到while判断一次,这一次读取的就是文件结尾-1(而判断循环的却是最后一个字符)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Systemverilog 文件I/O小结 的相关文章

随机推荐