在做图书管理系统项目对文件进行操作时,出现的多读取数据一次末尾数据的情况。纠结了一段时间,百度了下资料算是了解一半一半了。记录一下,忘记了可以看看。

feof()的原理:

  1. feof()函数,并不是通过读取到文件的EOF来评判,这个文件是否为空。
  2. 对feof()来说,它的工作原理是,站在光标所在位置,向后看看还有没有字符。如果有,返回0;如果没有,返回非0。它并不会读取相关信息,只是查看光标后是否还有内容。

原代码:

	char name[20], IBSN[20];

        while (!feof(f)){
   
            tem = (bookInfo*)malloc(sizeof(bookInfo));
            fscanf(f,"%s %s",name,IBSN);
            strcpy(tem->name,name);
            strcpy(tem->IBSN,IBSN);
            Increase(tem);
        }

由于C语言的 feof() 函数返回的是最后一次“读操作的内容”,在读到最后一个数据时,再进行读取,但此时的文件指针仍然指向最后一个数据,因而会再次读到最后一个数据。此时需要进行加个判断如下:

	while (!feof(f)){
   

           tem = (bookInfo*)malloc(sizeof(bookInfo));
        if ((fscanf(f,"%s %s",name,IBSN)) == EOF) {
   //防止尾部多读数据,feof()返回最后一次读写的内容,而eof()返回当前指针的位置
            free(tem);                             //feof()最后访问到文件结尾时返回EOF,但是文件指针仍然指向文件最后的字符,或者说前一个数据块,这个数据块在上次已经被访问过了
            break;                                 //因而多访问了一次,导致多出一个
        }
            strcpy(tem->name,name);
            strcpy(tem->IBSN,IBSN);
            Increase(tem);
        }
    }