免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1879 | 回复: 4
打印 上一主题 下一主题

一个关于fgets的问题,帮我看看 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-12-25 15:36 |只看该作者 |倒序浏览
我要从个很大的文件中读数据出来写到个结构里,每读到多少条数据就提交一次数据库。文件可能最后一行是空行,我现在想知道这个空行怎么处理?我的程序大概如下
while(fgets(filebuf,sizeof(filebuf),pfile)!=NULL)
{
    if (rows==MAX_INF_NUM)                                /*结构体满,入库*/
   {
           db_insert_db()
        EXEC SQL COMMIT;
   }
   else if (feof(pfile))        /*达到文件尾*/
  {
    /*处理完一个文件,将剩余结果写入tab_workflowumd*/
     db_insert_db();
     break;
   }
   /*文件内记录数+1*/
  filecount++;
}
现在的问题是,如果文件最后有个空行,则会漏数据,比如一共98条数据,每次10条入库,则最后8条会漏掉,这地方该怎么写啊。如果文件最后没空行就没这问题,都可以入库。

论坛徽章:
0
2 [报告]
发表于 2007-12-25 15:55 |只看该作者

回复 #1 allenpony 的帖子

读到feof的时候判断缓冲区里面是不是还有数据,如果曾经写入数据库的加一个标志位,标志没有置位并且还有数据的就继续写入数据库.

论坛徽章:
0
3 [报告]
发表于 2007-12-25 16:01 |只看该作者
其实问题就是如果有空行,那么fgets函数就跳出来了,根本到不了feof那里,于是就漏数据了,可以在循环外面再加上条入库的函数,但是我觉得那样看起来很别扭,就没那样写。如果改成下面,又会多读最后次数据,我恨feof
while(1)
{
    fgets.....
   if(feof)
    {
          入库
    }
}

论坛徽章:
0
4 [报告]
发表于 2007-12-25 16:03 |只看该作者

回复 #3 allenpony 的帖子

我觉得你的feof应该放在那个循环的外面.

因为并不是每次读取都到了feof处的,那个判断在很多情况下是无用的.

论坛徽章:
0
5 [报告]
发表于 2007-12-25 16:08 |只看该作者
我原来就像LS那样写的,但总觉得看起来别扭,读文件的循环里入库,读完了还入次。想把判断文件结束的语句放到循环里,但好像不行。循环外面根本不用判断feof,fget!=NULL就判断了文件读完了

[ 本帖最后由 allenpony 于 2007-12-25 16:12 编辑 ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP