一、文件打开和关闭
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) && 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(而判断循环的却是最后一个字符)。
来源:CSDN
作者:Lehmann112
链接:https://blog.csdn.net/sinat_39698659/article/details/104727577