创建一个文件,123.txt内容如下:
123456789

现在使用创建一个函数读取这个文件,main.c的内容如下:
#include
#include
#include

int main()
{
    FILE *fp = NULL;
    char buf[9] = {0};  

    if((fp = fopen("123.txt", "rb")) == NULL)
    {
       perror("file open failed!\n");
       exit(1);
    }
   
    while(!feof(fp))
    {
       fread(buf, 1, 3, fp);
       printf("buf:::%s\n", buf);
       memset(buf, '\0', sizeof(buf));
    }
    return 0;
}


所有人得到的结果应该是如下的:
buf:::123
buf:::456
buf:::789
buf:::

如果将fread(buf, 1, 3, fp);改为fread(buf, 1, 4 fp);
得到的结果是:
buf:::1234
buf:::5678
buf:::9

或许你会和我有同样的疑问,为什么会多了一个buf::: ???
查了下资料才知道,feof(fp)读到EOF并不认为是文件的结束符,(二进制文件中不可以以判断是否读到-1为文件的结束标志)依旧返回0,直到读到EOF的下一个字符才返回1,这时才认为是文件的结尾。

可以用fread(),gets(),fgets()这三个函数解决这个问题。
修改while循环:
    while(fread(buf, 1, 3, fp) == 3)
    {
       printf("buf:::%s\n", buf);
       memset(buf, '\0', sizeof(buf));
    }