| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 3710 人关注过本帖
标题:fstream 读取大文件eof()检测失效
取消只看楼主 加入收藏
ljw970243
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:43
专家分:105
注 册:2011-8-20
结帖率:60%
收藏
已结贴  问题点数:20 回复次数:5 
fstream 读取大文件eof()检测失效
ifstream in("data/log2.txt",ios::in);//文本格式日志文件,约5M
if(!in){
        cerr<<"canon open file!\n";
        return 1;
    }
    while(!in.eof()){//检测是否读取到文件结尾,小文件检测正常,大文件始则死循环
        if(!in.getline(str,140))break; //检测读取状态,失败则跳出循环,eof检测失效只能靠这个.
        len = strlen(str);
        if(len>maxlen){
            maxlen=len;
            mask = n;
            offset = in.tellg();
        }
        //nod.Setdate(str,nod.in);
        n++;
    }
cout<<in.eof();//读取小文件退出后返回值为1,读取大文件则始终为0..
求解!
搜索更多相关主题的帖子: 检测 canon return break while 
2011-09-10 19:46
ljw970243
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:43
专家分:105
注 册:2011-8-20
收藏
得分:0 
因为等很久没有找到原因,后来改用C才正常,又意外发现,用了c编译出来程序只有c++编译后的 十分之一不到,而且速度也快多了.
用c++编译后测试时间约700ms,而c编译的约100ms.

///////////////////////
回2L,因为日志文件涉及一些公司的信息,恕不能上传,请见谅.
你可以找个大点的文本文件来试试,
后来分析日志文件,发现最后一行是空的,不知是不是这个原因.
因为小文件是从日志文件截出一小段来测试的,最后一行不是空行.

[ 本帖最后由 ljw970243 于 2011-9-11 14:58 编辑 ]
2011-09-11 14:55
ljw970243
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:43
专家分:105
注 册:2011-8-20
收藏
得分:0 
#include <iostream>
#include <fstream>
using namespace std;
int main(int argc,char **argv){
    ifstream ff;
    char str[191];
    int err;
    ff.open(argv[1],ios::in);
    if(!ff.is_open()){
        cout<<"Cannot open file:"<<argv[1]<<endl;
        return 1;
    }
    cout<<"Eof:"<<ff.eof()<<endl;
    while(!ff.eof()){
        ff.getline(str,190);
        err=ff.fail();
        if(err){
            cout<<"File read error, code:"<<err<<endl;
            break;
        }
    }
    cout<<"Eof:"<<ff.eof()<<endl;
    cout<<"Error code:"<<err<<endl;
    ff.close();
    return 0;
}
读取两个文件小文件
一个结尾是空行,结果读取出错了,另一个结尾随便输个字,就正常结束.
全部文件打包...
test.rar (211.65 KB)

2011-09-11 23:07
ljw970243
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:43
专家分:105
注 册:2011-8-20
收藏
得分:0 
图片附件: 游客没有浏览图片的权限,请 登录注册
2011-09-11 23:08
ljw970243
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:43
专家分:105
注 册:2011-8-20
收藏
得分:0 
不知是不是我的编译器有问题,如果用<stdio.h>的I/O函数,程序就只有二三十KB,而用<iostream>的函数,程序体积就大了10倍,像刚才那个程序就有460KB.
有用过cygwin 编译的文件很小,速度也更快,到其他电脑就要带几个DLL文件.
先用mingw编译,文件大了一些,速度也慢了.
不知你用什么编译的?
2011-09-11 23:15
ljw970243
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:43
专家分:105
注 册:2011-8-20
收藏
得分:0 
昨天测试用C 的FILE读取一行也出现问题,如果最后一行是空的,读不到数据就不会改变字串,也就是说最后一行会重复一次...
后来换成逐个字符读取就没问题了.
2011-09-13 09:11
快速回复:fstream 读取大文件eof()检测失效
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.023714 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved