拆分输入字符串c ++

时间:2017-01-12 13:17:03

标签: c++

我正在读取一个文件,其中包含每行上此格式的数据。 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;作为分隔符,但也会分割字符串的名称部分,所以我不确定如何以另一种方式执行此操作。

3 个答案:

答案 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 expressionenter image description here 然后我们可以从结果中选择第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);
    }
}

Live demo

答案 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;