具体代码:
while (!feof(fp) && (count <= (list->size))) //如果文件没有结束并且数组没有满,那么就持续循环
{
//读取一行到buf中
if (fgets(buf, 1024, fp) != NULL)
{
k++;
printf("fgets执行了 %d 次 ------", k);
}
//将buf转换成整型数字,然后赋值给nums[count]
list->datas[count] = atoi(buf);
//count++
count++;
printf("成功读取了 %d 次\n", count);
}
txt文件
11
22
33
44
55
66
77
88
99
100
问题描述:
在使用fgets函数读取一个文本的信息时,如果最后一行是一个回车,那么读到的数据就会把最后一行数据保存两遍
如图:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pGBj0oM1-1602145237886)(C:\Users\79894\AppData\Roaming\Typora\typora-user-images\image-20201008141726780.png)]
问题分析:
这一段代码主要用到了两个函数,分别为:feof() 和 fgets()
feof() 如果遇到文件结尾就返回NULL
fgets() 如果读取了n-1个字符或者遇到换行符或者遇到文件结尾那么就会结束
为了方便分析,将文件以16进制显示
猜测fgets()在读入一行之前会先判断是否到了文件结束,如果文件结束,那么就不会读取
然后上面的问题就可以解释通了,在流刚刚结束的时候,循环依旧会执行,然后fgets没有执行,那么buf数组中的值就还是上一个值,然后就会多赋值一次
可以解释通了,在流刚刚结束的时候,循环依旧会执行,然后fgets没有执行,那么buf数组中的值就还是上一个值,然后就会多赋值一次