一、文件打开和关闭 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(而判断循环的却是最后一个字符)。