用字符串::擦除在C 中提取数据



我正在研究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;
}

最新更新