Chinaunix

标题: 运行C++程序报错:Segmentation fault(coredump) 请问为什么? [打印本页]

作者: richardzhang    时间: 2009-12-04 11:35
标题: 运行C++程序报错:Segmentation fault(coredump) 请问为什么?
bool find(string s,ifstream &f)
{
string str;
f.seekg(0,std::ios_base::beg);  
while(getline(f,str))
{  
       cout << str << endl;
}
return false;
}


int main(int argc, char* argv[])
{
        ifstream f("a.txt");
        for(int i = 0;i < 100;++i){
        cout << i << endl;
         if(!find("s",f))  
           {
                       
           }
        }  
        f.close();
        return 0;
}
在linux下报错:Segmentation fault(coredump)
在.net下执行不报错,但实际上 f.seekg(0,std::ios_base::beg);  没起作用,不知道为什么?

[ 本帖最后由 richardzhang 于 2009-12-4 13:19 编辑 ]
作者: OwnWaterloo    时间: 2009-12-04 11:35
楼主,试试在:
f.seekg(0,std::ios_base::beg);

后面,加上:
f.clear();

-------- -------- -------- -------- -------- -------- -------- --------
更新一下,上面说错了。
应该在seekg之前,调用clear。

如果流fail, seekg不会修改get position。
所以需要在seekg之前,而不是之后,调用clear,清除failbit和badbit,才能使seekg工作。

[ 本帖最后由 OwnWaterloo 于 2009-12-4 20:31 编辑 ]
作者: 雨过白鹭洲    时间: 2009-12-04 12:15
看不出来

seekg是什么东西
作者: richardzhang    时间: 2009-12-04 12:21
标题: 回复 #2 雨过白鹭洲 的帖子
我想只打开一次文件,每次执行getline前使用seekg回到文件开头。
作者: ffangjian    时间: 2009-12-04 12:54
一步一步的debug
作者: prolj    时间: 2009-12-04 12:58
我刚改了一个Segmentation fault,有core就gdb吧。估计是数组指针混用了。
作者: peidright    时间: 2009-12-04 13:02

大虾,getline是从输入读取一行到缓冲区,好不好。
if(!find("s",f))  你传给find发的是一个字符串"s",而不是缓冲区。
就是getline()函数用错了。
不懂c++,不过还是找出了问题,请楼主给分。

[ 本帖最后由 peidright 于 2009-12-4 13:11 编辑 ]
作者: sljzj    时间: 2009-12-04 13:17
标题: 回复 #2 雨过白鹭洲 的帖子
dsfsdf
作者: sljzj    时间: 2009-12-04 13:18
标题: 回复 #1 richardzhang 的帖子
sdfsdfsdf
作者: peidright    时间: 2009-12-04 16:43
,学习了,真复杂呀。。
作者: OwnWaterloo    时间: 2009-12-04 16:58
标题: 回复 #11 peidright 的帖子
是很复杂……   不学也罢

直接学lua或者python吧。 据说有这么一个说法:C+python搞定99%的事情
作者: richardzhang    时间: 2009-12-04 16:58
标题: 回复 #2 OwnWaterloo 的帖子
应该是f.seekg(0,std::ios_base::beg);
前面,加上:
f.clear();

原因是getline()执行到文件末尾后会改状态为eof,导致seekg运行不正常,加上clear()就可以了
作者: peidright    时间: 2009-12-04 17:05
标题: 回复 #12 OwnWaterloo 的帖子
,那剩余1%的事情? 交给汇编 + lisp?
作者: OwnWaterloo    时间: 2009-12-04 20:18
标题: 回复 #13 richardzhang 的帖子
对,是我的错误。应该放在前面。
我去更新那贴。
作者: OwnWaterloo    时间: 2009-12-04 20:19
标题: 回复 #14 peidright 的帖子
不,交给别人去做




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2