
使用fgets函数读文件时最后一行会重复问题
——lvyilong316
在使用fgets函数读文件时发现每次最后一行都会重复读一遍,程序如下:
#include
#include
intmain()
{
FILE*fp;
charch[128];
fp=fopen("a.txt","r");
while(!feof(fp))
{

fgets((char*)ch,sizeof(ch)-1,fp);
printf("%s",ch);
}
fclose(fp);
}
其中a.txt文件内容如图1所示。

图1
运行程序结果如图2所示。

图2
要想知道为什么最后一行会重复输出,需要知道以下两点:

lfeof()只有在你尝试读取文件结尾之后,才会返回true。也就是说,feof()只解释上次文件读写是否到达结尾,而不是下一次。
lfgets()每次读一行,也就是直到读到换行符或者文件结尾才返回,注意如果有换行符,fgets()会连同换行符读入。
下面分析一下上面程序的执行过程:
(1)判断是否读到了文件结尾(否);
(2)读取一行”aaaaaaaaaaaaaaaaaaaa\n”,输出;
(3)判断是否读到了文件结尾(否);
(4)读取一行”bbbbbbbbbbbbbbbbbb\n”fgets读取一行,输出;
(5)判断是否读到了文件结尾(否);
(6)读到了文件结尾返回,注意本次没用从文件中读到任何东西,所以字符串ch中保存的还是原来第(4)步读到的内容。所以又将”bbbbbbbbbbbbbbbbbb\n”再次输出。
(7)判断是否读到了文件结尾(是);
(8)结束循环。
如果将a.txt的内容换做图3所示,即第二行后没有回车。


图3
再次运行程序输出如图4:

图4
过程分析:
(1)判断是否读到了文件结尾(否);
(2)读取一行”aaaaaaaaaaaaaaaaaaaa\n”,输出;
(3)判断是否读到了文件结尾(否);
说白了就是:当你的文件指针已经读取到最后了,但是feof还是会返回没有到文件的末尾,你再去读一次,读到了一次空的数据,这时用feof判断才会真正的返回非0值,表示文件到达文件尾了。程序先创建一个文件,写入4个类型的数据,然 后把读/写指针定位到文件开头逐个读取并输出当前指针的位置fgets读取一行, 如果到了文件结尾则提示已经到达文件结尾,重新定位文件到开头并读取一个字符串。arcview gis有工具来读取cad文件作为有效的gis数据源,这些工具直接读一个cad文件到磁盘。
(5)判断是否读到了文件结尾(是);
(6)结束循环。

l补充:
1.使用vim编辑文件保存时会默认在末尾添加一个换行符。如何如图5所示在vim输入数据。

图5
使用editplus打开情况如图6所示:

图6
文件使用方式意义“rt”只读打开一个文本文件,只允许读数据“wt”只写打开或建立一个文本文件,只允许写数据“at”追加打开一个文本文件,并在文件末尾写数据“rb”只读打开一个二进制文件,只允许读数据“wb”只写打开或建立一个二进制文件,只允许写数据“ab”追加打开一个二进制文件,并在文件末尾写数据“rt+。360杀毒软件添加信任白名单: 1.找到360杀毒图标,双击打开"360杀毒",点击右上角的"设置"按钮,如图1所示 图1 2.在"360杀毒-设置"界面中点击"文件白名单",如图2所示 图2 3.在弹出来的窗口中点击"添加文件"按钮,如图3所示 图3 4.选择要添加的软件双击,然后点击"打开",如图4所示 图4 5.在"文价内容发生变化后此白名单失效"前面把勾去掉,。dr.sms使用十分简单,打开drsmsver6.exe,点击add添加游戏rom(这里默认是添加后缀名为.sms的rom文件,如果想添加.gg/.sc/.sg后缀的文件,可以直接把文件拖进转换列表里,或者把打开信息框中的文件类型选为all files),然后点击broese...确定生成的rom存放路径及名称,最后点击create gba rom就可以直接生成了。

图7
使用editplus打开b.txt如图8。

图8
同样在结尾添加了一个换行。
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-112959-1.html
没人敢惹吧