我正在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返回nposnpos的值是std::size_t的最大值(如果使用默认分配器)。将此值添加到begin将给您一个无效的迭代器。

只需在擦除之前与npos比较即可避免此问题。

if (pos != string::npos) {
    myline.erase((myline.begin() + pos), myline.end());
}

10-06 15:23