簡體   English   中英

用c ++中的string :: erase提取數據

[英]Extracting data with string::erase in c++

我正在研究csv上的數據讀寫。

所以我想出了這個問題。

我正在使用getline(myfile, myline);從csv中取一行getline(myfile, myline); 我將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()時遇到錯誤我覺得因為當我把它放在評論中時它運行得很順利。 我想知道我在myline.begin()添加了size_t是否正確? (沒有編譯錯誤)。 作為提取數據的心態,它也是正確的嗎?

錯誤如下:

在拋出'std :: length_error'的實例后調用終止what():basic_string :: _ S_create

很難理解為什么你會看到這個問題。 我的建議:

刪除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;
}

使用提供的數據的示例不會導致錯誤。 但是如果輸入不包含逗號,則會出現問題,例如,如果您嘗試對最后一個元素進行標記,則會遇到此問題。 如果找不到匹配項, std :: string :: find將返回npos npos的值是std::size_t最大值(如果使用的是默認分配器)。 將此值添加到begin將為您提供無效的迭代器。

在擦除之前簡單地與npos進行比較以避免此問題。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM