我正在csv上进行数据读取和写入。
所以我想到了这个问题。
我正在使用getline(myfile, myline);
从csv中提取一行,并将myline发送到一个函数中,以提取所有无用的信息并将该部分保留在所需的某些“,”(逗号)之间。
我用此功能实现了这一点:
int get_id(string myline) {
int id;
size_t pos;
pos = myline.find(",");
myline.erase((myline.begin() + pos), myline.end());
stringstream converter(myline);
converter >> id;
return id;
}
我只有一个
myline.find(",");
,因为我想要的数据是该行的第一行。我的csv格式范例:
id,name,age,address
因此,我认为
myline.erase()
出现错误,因为当我将其放入注释中时,它运行平稳。我想知道将size_t
添加到myline.begin()
是否正确? (无编译错误)。作为提取数据的心态,这也正确吗?错误如下:
最佳答案
使用提供的数据的示例不会导致错误。但是,如果输入不包含逗号,则会出现问题,例如,当您尝试对最后一个元素进行标记化时会遇到这种情况。如果找不到匹配项,std::string::find返回npos。 npos
的值是std::size_t
的最大值(如果使用默认分配器)。将此值添加到begin
将给您一个无效的迭代器。
只需在擦除之前与npos
比较即可避免此问题。
if (pos != string::npos) {
myline.erase((myline.begin() + pos), myline.end());
}