C ++ Code Dumping" random"数据

时间:2014-06-17 17:31:46

标签: c++ windows mingw codeblocks dump

我首先要说的是,作为一名C ++程序员,我是一个相当新的人。 但是我理解PHP和VBA,所以对编程基础知识的各个方面有很好的理解。

因为我在日常工作中经常使用CSV,所以我认为编写一个操作CSV文件的库是一个很好的学习练习。

我写了这个函数:

int getHeaders(ifstream & os, vector<string> & head2){
    string STRING;
    getline(os,STRING);
    cout << STRING << endl;
    STRING.erase(remove(STRING.begin(), STRING.end(), '\"'), STRING.end());
    string::iterator it = STRING.begin();
    int x = 0;
    for (int index = 0; it < STRING.end(); it++, index++) {
        if (*it == ',') {
            head2.push_back(STRING.substr(0,index));
            STRING.erase(0,index+1);
            cout << endl << head2[x];
            cout << endl << STRING;
            x++;
        }
    }
    return head2.size();
}

以下称为:

int addRowCount = 0;
vector<string> head1;

ifstream outfile;
outfile.open("default.csv", ios_base::app);

cout << getHeaders(outfile, head1) << endl;
cout << head1[0] << endl << head1[1] << endl;

但是当我运行程序时,程序只是将一堆随机垃圾转储到控制台(并使应用程序崩溃) 我正在使用Windows,所以不能使用valgrind。

有谁知道为什么会这样?显然这个“转储”不是我想要的应用程序。我希望有人可以指出我的代码部分可以实现这一点。

提前致谢。

2 个答案:

答案 0 :(得分:2)

当您对字符串调用erase时,该字符串中的迭代器将失效,因此在调用it后使用STRING.erase()会出错。

提示:当您查看支持迭代器的类的方法的文档时,请留意有关使迭代器无效的注释。例如,在this page上,请阅读标题为Iterator validity

的部分

[与答案无关,但是样式问题:对于像STRING这样的变量名使用ALL CAPS通常被认为是C和C ++中的错误样式。所有大写名称都用于#defined symbols]

答案 1 :(得分:0)

事实证明head2 [1]没有设置,所以它是某种内存泄漏。

在评论部分对建议进行一些进一步修改之后,这是完成的功能:

int getHeaders(ifstream & os, vector<string> & head2){
    string STRING;
    getline(os,STRING);
    STRING.erase(remove(STRING.begin(), STRING.end(), '\"'), STRING.end());
    int strle = count(STRING.begin(),STRING.end(), ',') + 1;
    for(int x = 0; x != strle; x++){
        if (count(STRING.begin(), STRING.end(), ',') > 0) {
            head2.push_back(STRING.substr(0,STRING.find_first_of(',')));
        } else {
            head2.push_back(STRING.substr(0,STRING.length()));
        }
        STRING.erase(0,STRING.find_first_of(',')+1);
    }
    return head2.size(); 
}