0

我试图只使用 peek 从文件中获取一个特定的行,然后将该行中的值放入数据类型的事物中。

for(int i = 0; i < students.length(); i++)
{
    int q = 0;
    fin >> name;
    students[i].n = name;
    while(fin.peek() != '\n')
    {
        students[i].tests.resize(students[i].tests.length()+1);
        fin >> test;
        students[i].tests[q] = test;
        q++;
    }

Peek 从来没有真正向我解释过,我将如何改变它,以便它可以有效地将 student[i].tests 调整为我在文件的特定行中有多少数字?在这一点上,它似乎正在无限地调整大小。

4

1 回答 1

0

如果换行符之前有空格,您的代码将无法工作,并且在到达文件结尾时将无限循环。

更好的做法是使用 astd::istringstream来解析数字,然后push_back将它们放到tests vector:

for (int i = 0; i < students.length(); ++i)
{
    ASSERT_THROW(fin >> students[i].n, "unable to read student name");
    std::string line;
    ASSERT_THROW(getline(fin, line), "unexpected failure or EOF in file");
    std::istringstream iss(line);
    int n;
    while (iss >> n)
        students[i].tests.push_back(n);
    ASSERT_THROW(iss.eof(), "invalid content in '" << line
                 << "' after test scores");
}

WhereASSERT_THROW在检查和抛出错误时执行代码,例如

#define ASSERT_THROW(X, MSG) \
    do { \
        if (X) break; \
        std::ostringstream oss; \
        oss << __FILE__ << ':' << __LINE__ << " ASSERT_THROW(" \
              << #X << ") " << MSG; \
        throw std::runtime_error(oss.str()); \
    } while (false)
于 2015-03-31T04:23:35.693 回答