我正在读取一个文件,其中包含每行上此格式的数据。 30304 Homer Simpson
我需要能够将它传递给下面的构造函数,整数是regNo,字符串其余部分的名称,每个学生都有自己的标记映射。
Student::Student (string const& name, int regNo):Person(name)
{
regNo = regNo;
map<string, float> marks;
}
然后我必须将每个学生添加到学生的集合中,这是最好的,我该怎么做?
到目前为止,我所得到的只是获取文件名并检查它是否存在。
int main()
{
//Get file names
string studentsFile, resultsFile, line;
cout << "Enter the Students file: ";
getline(cin, studentsFile);
cout << "Enter the results file: ";
getline(cin, resultsFile);
//Check for students file
ifstream students_stream(studentsFile);
if (!students_stream) {
cout << "Unable to open " << studentsFile << "\n";
return 1;
}
}
我尝试使用带有3个参数的getline和&#34; &#34;作为分隔符,但也会分割字符串的名称部分,所以我不确定如何以另一种方式执行此操作。
答案 0 :(得分:3)
当然,用您的输入文件流替换#include <iostream>
#include <string>
#include <stdexcept>
int main()
{
std::string line, name;
unsigned long long regNo;
size_t nameOfs;
while (true) {
// Read full non-empty line from input stream
try {
std::getline(std::cin, line);
if (line.empty()) break;
}
catch(const std::ios_base::failure & readLineException) {
break;
}
// parse values:
// 1. unsigned long long ending with single white space as "regNo"
// 2. remaining part of string is "name"
try {
regNo = std::stoull(line, &nameOfs);
name = line.substr(nameOfs + 1);
}
catch(const std::logic_error & regNoException) {
// in case of invalid input format, just stop processing
std::cout << "Invalid regNo or name in line: [" << line << "]";
break;
}
// here values regNo + name are parsed -> insert them into some vector/etc.
std::cout << "RegNo [" << regNo << "] name [" << name << "]\n";
}
}
。对于&#34; trim&#34;它可能是理智的。名称结果,除非您100%知道输入格式正确。我只是以某种方式添加了极少的错误状态处理&#34;幸存&#34;。
当然,任何现实世界的应用程序都应该读取单个/三个/更多变体的名称。
{{1}}
答案 1 :(得分:1)
可以使用regular expression: 然后我们可以从结果中选择第2组和第3组。
std::vector<Student> students;
std::regex r{R"(((\d+) )(.+))"};
for(std::string line; getline(students_stream, line);) {
auto it = std::sregex_iterator(line.begin(), line.end(), r);
auto end = std::sregex_iterator();
if(it == end || it->size() != 4)
throw std::runtime_error("Could not parse line containing the following text: " + line);
for(; it != end; ++it) {
auto match = *it;
auto regNo_text = match[2].str();
auto regNo{std::stoi(regNo_text)};
auto name = match[3].str();
students.emplace_back(name, regNo);
}
}
答案 2 :(得分:0)
您可以使用getline()
获取输入并读取一个完整的行(没有第三个参数),然后使用stringstream提取数字和剩余的字符串。 stringstream示例:
string s = "30304 Homer Simpson", name;
stringstream ss(s);
int num;
ss >> num; //num = 30304
getline(ss, name); //name = Homer Simpson
cout << num;
cout << name;