2010-04-19 91 views
0

我遇到了以下代码段的问题。stringstream问题 - 向量迭代器无法取消引用

它与stringstream“stringstream css(cv.back())”有关。如果它被注释掉,程序将运行正常。

这真的很奇怪,因为我一直在我的一些程序中得到它,但如果我只是创建一个控制台项目,代码将运行良好。在我的一些Win32程序中,它会在某些情况下不会(然后它会返回“vector iterator not derefereenable”,但它会编译得很好)。

任何想法都将非常感激。谢谢!

vector<double> cRes(2); 
vector<double> pRes(2); 

int readTimeVects2(vector<double> &cRes, vector<double> &pRes){ 
    string segments; 
    vector<string> cv, pv, chv, phv; 
    ifstream cin("cm.txt"); 
    ifstream pin("pw.txt"); 
    ifstream chin("hm.txt"); 
    ifstream phin("hw.txt"); 

    while (getline(cin,segments,'\t')) { 
     cv.push_back(segments); 
    } 

    while (getline(pin,segments,'\t')) { 
     pv.push_back(segments); 
    } 

    while (getline(chin,segments,'\t')) { 
     chv.push_back(segments); 
    } 

    while (getline(phin,segments,'\t')) { 
     phv.push_back(segments); 
    } 

    cin.close(); 
    pin.close(); 
    chin.close(); 
    phin.close(); 

    stringstream phss(phv.front()); 
    phss >> pRes[0]; 
    phss.clear(); 
    stringstream chss(chv.front()); 
    chss >> cRes[0]; 
    chss.clear(); 

    stringstream pss(pv.back()); 
    pss >> pRes[1]; 
    pss.clear(); 
    stringstream css(cv.back()); 
    css >> cRes[1]; 
    css.clear(); 

    return 0; 
} 
+3

你确定'cv'不是空的吗? – Naveen 2010-04-19 13:22:16

+0

你需要多解释一下。你遇到什么问题? – 2010-04-19 13:31:53

+1

不解决你的问题,但这应该真的重构。你有基本相同的代码,你用不同的名字四次调用。 – 2010-04-19 13:34:50

回答

1

这里有两个主要问题。这些问题中的任何一个或两个都可能导致您遇到的问题。

你是你的范围以外隐瞒名称:

vector<double> cRes(2); 
vector<double> pRes(2); 

int readTimeVects2(vector<double> &cRes, vector<double> &pRes){ 

CRES和PRES将要变量传递给你的函数,而不是你已经证明了全局变量。

您需要向我们展示了在问题发生时,我们就可以诊断这个问题之前调用代码 - 尽管我不知道为什么你不只是使用的push_back这里,


还有另外一个问题在这里:

stringstream phss(phv.front()); 
stringstream chss(chv.front()); 
stringstream pss(pv.back()); 
stringstream css(cv.back()); 

你没有检查,以确保PHV,CHV,PV和CV是不是空。上面的std::getline完全有可能会阻止它们成功完成,而且您传递的文件也完全可能是空的。

+0

@比利他也在里面偷偷摸摸一个“cin”,以增加混乱:-) – 2010-04-19 13:35:40

+0

解决了 - 感谢比利。这是一些文件空白/不存在的问题(我尝试静态链接时曾有过动作,我认为我已经仔细检查了这一点,但我一定错过了一两个奇怪的文件)。 我不太在意错误检查,因为程序不会被分发,并会收到固定大小的txt文件(但我可以看出为什么应该这样做)。 非常感谢! – andreas 2010-04-19 13:56:51