有关fgetc配合feof逐行读取文件最后一行读取两遍的错觉?
最近在做一个wifiap设置的接口,用户首先获取到当前wifi 热点的ssid 和pwd,然后修改,保存。
获取信息的时候是fopen对应的hostapd.conf文件,逐行读取,查找匹配的参数。
修改的时候则是逐行读取当前hostapd.conf文件,逐行写到新的临时配置文件里面,如果匹配到ssid或者pwd则修改成新的值再写到新文件里面。
最后将新的临时配置文件rename成hostapd.conf。
测试的时修改完后,cat出hostapd.conf的检查发现最后一行总是重复两遍。
虽然不影响整体功能,但是非常出乎意料,超出预期设计的效果。
读取更新的代码逻辑大致如下
while (!feof(srcF))
{
//get line data
fgets(tmp, sizeof(tmp), srcF);
f = tmp;
LOGD("get %s",f); //clear space in the head
while(' ' == *f || '\n' == *f || '\r' == *f)
f++;
if('\0' == *f)
continue;
//if the comments copy directly
if('#' == *f)
{
LOGD("get comments %s", f);
fputs(f, dstF);
continue;
}
p = strstr(f, WIFI_SSID);
//we must makesure it is start with my str
if(p == f)
{
//replace new ssid name
p += strlen(WIFI_SSID);
sprintf(p,"%s\n", ssid);
LOGD("replace new ssid %s",f);
fputs(f, dstF);
continue;
} p = strstr(f, WIFI_PW);
//we must makesure it is start with my str
if(p == f)
{
//replace new password
p += strlen(WIFI_PW);
sprintf(p,"%s\n", pw);
LOGD("replace new pwd%s",f);
fputs(f, dstF);
continue;
}
else
fputs(f, dstF);
LOGD("copy %s",f);
大概看一下总体的循环逻辑是没错
【判断是否到了文件结束-->读取一行内容-->将读取的内容写到新的文件中】
但是仔细查条件检查和返回值的判断,还是发现忽略了一些细节。
1、读完了最后一行还没读到EOF,需要下一次读取才到EOF。
2、没有对fgets返回值进行判断,最后一次读完再去读取的时候会返回NULL。
3、没有对读取数据的tmp buf进行清空处理。
事实上最后一次没读到东西,只是tmp里面的数据是上一次读取没有清空的,所以造成了重复读取的错觉。
解决方法如下:
1、判断fgets返回值,如果是NULL则continue返回去继续判断eof
while (!feof(srcF))
{
//get line data
if(NULL == fgets(tmp, sizeof(tmp), srcF))
continue;
...........
}
2、先读取后判断eof
while (1)
{
//get line data
fgets(tmp, sizeof(tmp), srcF);
if(feof(srcF))
break;
................ }
以上经过验证ok。
另外最好在每次使用buf前都进行一次memset,清空缓存。
有关fgetc配合feof逐行读取文件最后一行读取两遍的错觉?的更多相关文章
- PureBasic 读取文件中一行的两个数据例子
, "Test1.txt") ; if the file could be read, we continue... , "Test2.txt") ) = ; ...
- shell读取文件每一行的方式
1.使用read命令读取一行数据 while read myline do echo "LINE:"$myline done < datafile.txt 2.使用read命 ...
- shell脚本中每次读取文件的一行
写法一: #!/bin/bash while read linedo echo $line #这里可根据实际用途变化 done < file #需要读取的文件 ...
- python读取文件,python读取的1变成\ufeff1
'\ufeff1' movies={} fm=open(self.path+'/movie.txt',encoding='utf-8') w2=open('./data/1.txt','a') for ...
- C++/Php/Python/Shell 程序按行读取文件或者控制台
写程序经常需要用到从文件或者标准输入中按行读取信息,这里汇总一下.方便使用 1. C++ 读取文件 #include<stdio.h> #include<string.h> i ...
- PHP文件操作 之读取一个文件(以二进制只读的方式打开)
最近应用了文件的读取,顺便复习一下! //读取一个文件 $f = fopen($filename,'rb'); $f: 表示返回的一个资源句柄 $filename:要打开的文件路径 rb:参数,表示只 ...
- 类似于c语言读取文件进行解析
$log_file_name = 'D:/static/develop/kuai_zhi/acagrid.com/public/Logs/'.date('Ym').'/'.date('d').'_er ...
- C++/Php/Python/Shell 程序按行读取文件或者控制台方法总结。
C++/Php/Python/Shell 程序按行读取文件或者控制台方法总结. 一.总结 C++/Php/Python/Shell 程序按行读取文件或者控制台(php读取标准输入:$fp = fope ...
- java中读取文件以及向文件中追加数据的总结
package gys; import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; imp ...
随机推荐
- linux关于profile 、bashrc 、.bash_profile、.bashrc的区别
linux关于profile .bashrc ..bash_profile..bashrc的区别 - /etc/profile /etc/bashrc ~/.bash_profile ~/.bashr ...
- 学习PHP中的iconv扩展相关函数
想必 iconv 这个扩展的相关函数大家多少都接触过,做为 PHP 的默认扩展它已经存在了很久,也是我们在操作字符编码时经常会使用的函数.不过除了 iconv() 这个函数外,你还知道它的其它函数吗? ...
- Linux系列(35) - 光盘yum源搭建(2)
光盘搭建yum源 背景 当前Linux服务器没有网络,yum源下载好了,在光盘中 step-01 挂载光盘 mkdir /mnt/cdrom #建立挂载点 mount /dev/cdrom /mnt/ ...
- 新一代容器平台ACK Anywhere,来了
5G.AR.AIoT 等场景在推动新一代云架构的演进,而容器重塑了云的使用方式. 近日,阿里云容器服务全面升级为ACK Anywhere,让企业在任何需要云的地方,都能获得一致的容器基础设施能力. 早 ...
- 小白自制Linux开发板 三. Linux内核与文件系统移植
上一篇完成了uboot的移植,但是想要愉快的在开发板上玩耍还需要移植Linux内核和文件系统. 1.Linux内核 事实上对于F1C100S/F1C200S,Linux官方源码已经对licheepi ...
- iframe、SameSite与CEF
iframe.SameSite与CEF 背景 本人使用CEF(或是Chrome)来加载开发的前端页面,其中使用iframe嵌入了第三方页面,在第三方页面中需要发送cookie到后端,然而加载会报错,第 ...
- CefSharp请求资源拦截及自定义处理
CefSharp请求资源拦截及自定义处理 前言 在CefSharp中,我们不仅可以使用Chromium浏览器内核,还可以通过Cef暴露出来的各种Handler来实现我们自己的资源请求处理. 什么是资源 ...
- Apache ShardingSphere 在京东白条场景的落地之旅
京东白条使用 Apache ShardingSphere 解决了千亿数据存储和扩容的问题,为大促活动奠定了基础. 2014 年初,"京东白条"作为业内互联网信用支付产品,数据量爆发 ...
- bzoj1503 郁闷的出纳员(平衡树,思维)
题目大意: 现在有n个操作和一个最低限度m \(I\)命令\(I\ k\)新建一个工资档案,初始工资为k. \(A\)命令$A\ k $把每位员工的工资加上k \(S\)命令$S\ k $把每位员工的 ...
- 【UE4】虚幻引擎技术直播汇总(含中英文直播)
B站虚幻引擎官方账号 中文直播 [中文直播]第35期 | 使用GIS在UE中创造真实地球风貌 | Epic 周澄清 [中文直播]第34期 | 包教包会的Epic MegaGrants申请之道 | Ep ...