0

当我向正在读取的 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,NoahSuojanenKindler,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
4

1 回答 1

0

通过使用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));
    line.erase(0, line.find(delimiter) + delimiter.length());

    int borrowed = stoi(line);

    books.push_back({isbn, bookName, bookAuthor, borrowed});
    i++;
}
于 2019-11-14T14:28:32.070 回答