我正在研究CSV的数据阅读和写作。
所以我提出了这个问题。
我正在使用getline(myfile, myline);
从CSV乘坐一条线,然后将我的线发送到一个函数,以提取所有无用的信息,并在某些确定的"(逗号)之间保持一部分。
我用此功能实现了此功能:
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()
上遇到了一个错误,因为当我将其注释时,它会顺利进行。我想知道我向myline.begin()
添加了size_t
是正确的吗?(没有汇编错误)。作为提取数据的心态也正确吗?
错误如下:
丢弃'std :: length_error'what what()的实例后终止调用:basic_string :: _ s_create
示例,提供的数据不会导致错误。但是,如果输入不包含逗号,将会有一个问题,例如,如果您尝试将最后一个元素归纳,则会遇到。std :: string ::如果找不到匹配,则查找返回NPO。npos
的值是std::size_t
的最大值(如果使用默认分配器)。将此值添加到begin
将为您提供无效的迭代器。
在擦除之前,请与npos
进行比较以避免此问题。
if (pos != string::npos) {
myline.erase((myline.begin() + pos), myline.end());
}
很难看到为什么看到问题。我的建议:
删除erase
功能调用。如果该行包含一个数字,则是,
,则流提取器将以任何方式停在,
。只是使用:
int get_id(string myline) {
int id = 0;
stringstream converter(myline);
converter >> id;
return id;
}
如果您必须擦除,则可能要添加另一个支票。
int get_id(string myline) {
// Erase only if there is a "," in the line.
atuo pos = myline.find(",");
if ( pos != std::string::npos )
{
myline.erase((myline.begin() + pos), myline.end());
}
int id = 0;
stringstream converter(myline);
converter >> id;
return id;
}