无法使用substr正确解析带空格的字符串并查找

当我向要读取的csv文件添加空格时,例如将“ ProgrammingInterviews”更改为“ Programming Interviews”,我的程序崩溃并显示以下错误:

terminate called after throwing an instance of 'std::invalid_argument'  
  what():  stoi    
Aborted (core dumped)

stoi()抱怨,因为正在被输入字符串。填充后直接打印出字符串数组的每个元素,向我展示了该函数将忽略定界符,并停止读取空白字符,然后使用相同的字符串填充字符串数组的每个元素。

据我了解,这不是substr()find()的预期行为。

fstream finb ("books.csv",ios::in);

// Buffer
char arr[100];
string s;
string delimiter = ",";

while(fins>>arr){

    s=arr;
    int i;

    string data[3];

    for(i=0; i<3; i++){
        data[i] = s.substr(0,s.find(delimiter));
        cout << "data[" << i << "]: " << data[i] << endl;
        s.erase(0,s.find(delimiter) + delimiter.length());
    }
    students.push_back({stoi(data[0]),data[1],data[2],stoi(s)});
}

带空格的csv示例(不起作用):

111941847,Programming Interviews,NoahSuojanenKindler,0

不带空格的csv示例(有效):

111941847,ProgrammingInterviews,0

csv中带有空格的字符串数组的示例:

data[0]: 111941847
data[1]: Programming
data[2]: Programming
s: Programming

csv中不带空格的字符串数组的示例:

data[0]: 111941847
data[1]: ProgrammingInterviews
data[2]: NoahSuojanenKindler
s: 0
yx_hcr 回答:无法使用substr正确解析带空格的字符串并查找

通过使用getline()而非operator>>进行了修复。

for (string line; getline(finb,line);) {
    int isbn = stoi(line.substr(0,line.find(delimiter)));
    line.erase(0,line.find(delimiter) + delimiter.length());

    string bookName = line.substr(0,line.find(delimiter));
    line.erase(0,line.find(delimiter) + delimiter.length());

    string bookAuthor = line.substr(0,line.find(delimiter) + delimiter.length());

    int borrowed = stoi(line);

    books.push_back({isbn,bookName,bookAuthor,borrowed});
    i++;
}
本文链接:https://www.f2er.com/3103148.html

大家都在问