c语言fgets()函数使用时遇到的问题

    科技2025-10-20  9

    具体代码:

    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数组中的值就还是上一个值,然后就会多赋值一次

    Processed: 0.013, SQL: 8