要么你没有在你的代码using namespace std
,或者你没有完全限定与std::
前缀API的提出std名称空间中调用,例如,std::getline()
。下面的解决方案解析CSV而不是标记其中包含空格的值。 stdin提取,解析CSV以及将字符串转换为int的逻辑都是分开的。 regex_token_iterator用法可能是最复杂的部分,但它大部分使用非常简单的正则表达式。
// foo.txt:
// Adam,English,85
// Charlie,Math,76
// Erica,History,82
// Richard,Science,90
// John,Foo Science,89
// after compiling to a.exe, run with:
// $ ./a.exe < foo.txt
// output
// name: Adam, course: English, grade: 85
// name: Charlie, course: Math, grade: 76
// name: Erica, course: History, grade: 82
// name: Richard, course: Science, grade: 90
// name: John, course: Foo Science, grade: 89
#include <iostream>
#include <sstream>
#include <regex>
#include <vector>
using namespace std;
typedef unsigned int uint;
uint stoui(const string &v) {
uint i;
stringstream ss;
ss << v;
ss >> i;
return i;
}
string strip(const string &s) {
regex strip_pat("^\\s*(.*?)\\s*$");
return regex_replace(s, strip_pat, "$1");
}
vector<string> parse_csv(string &line) {
vector<string> values;
regex csv_pat(",");
regex_token_iterator<string::iterator> end;
regex_token_iterator<string::iterator> itr(
line.begin(), line.end(), csv_pat, -1);
while (itr != end)
values.push_back(strip(*itr++));
return values;
}
struct Student {
string name;
string course;
uint grade;
Student(vector<string> &data) :
name(data[0]), course(data[1]), grade(stoui(data[2])) {}
void dump_info() {
cout << "name: " << name <<
", course: " << course <<
", grade: " << grade << endl;
}
};
int main() {
string line;
while (getline(cin, line)) {
if (!line.empty()) {
auto csv = parse_csv(line);
Student s(csv);
s.dump_info();
}
}
}
您是否意识到只有在名称和课程不包含空格的情况下,您的程序才会有效?它会失败的“约翰史密斯英语”或“亚当计算机科学”... –