我首先要说的是,作为一名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。
有谁知道为什么会这样?显然这个“转储”不是我想要的应用程序。我希望有人可以指出我的代码部分可以实现这一点。
提前致谢。
答案 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();
}