[英]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.