从一个陷入循环的文件输出而不是读取?

时间:2014-11-11 20:57:21

标签: c++ file loops

所以下面代码底部的while循环只是在我添加行之前连续循环我已经工作了

questionFile >> answersArray[i];

这条线似乎打破了它,所以没有任何东西写入问题阵列,我对此感到非常难过,所以请帮助。

ifstream questionFile;
int i = 0;
switch (x){
case 1:
    questionFile.open("Topic1 Questions.txt", ios::app);
    break;
case 2:
    questionFile.open("Topic2 Questions.txt", ios::app);
    break;
case 3:
    questionFile.open("Topic3 Questions.txt", ios::app);
    break;
case 4:
    questionFile.open("Topic4 Questions.txt", ios::app);
    break;
}
if (!questionFile)
{
    cout << "Cannot load file" << endl;
}
else
{
    if (questionFile.peek() != ifstream::traits_type::eof()) {
        while (!questionFile.eof())
        {
            getline(questionFile, questionsArray[i]);
            questionFile >> answersArray[i];
            i++;
        }
    }
    questionFile.close();
}

2 个答案:

答案 0 :(得分:1)

getlineoperator>>从文件中提取但getline读取直到'\ n'(或您指定的任何字符),而operator>>读取直到空格。此外,operator>>将在流中保留'\ n',导致getline的下一次调用无法读取。

阅读getlineoperator>>文档了解更多详情(这些是链接)。

此外,发布问题/答案存储在文件中的格式,因为代码的运行方式非常依赖于此。如果您只是期待交替的问题和答案,只需使用getline并忘记操作员。

希望这有帮助。

答案 1 :(得分:0)

如果没有看到类似answersArray的内容,确定你的问题是有点困难(好吧,不可能,真的)。它(也很多)有助于查看您想要读取的输入文件的样本。

目前,我假设您的输入文件至少看起来像这样:

1) air 2) earth 3) fire 4) water
3
1) Solid 2) Liquid 3) Gas 4) Plasma
2

即,一行是一个字符串(包含问题或可能的答案,或者两者都有),下一行是表示正确答案的单个数字(或该顺序上的某些内容)。

假设是这种情况,我会使用std::getline从输入文件中读取所有数据。然后我将它分成必要的部分。

我可能还会创建一个answer类(或类似的东西)来保存字符串和数字,并为该类重载operator>>以读取它们。

struct answer { 
    std::string question;
    int answer;

    friend std::istream &operator>>(std::istream &is, answer &a) { 
        std::getline(is, a.question);
        std::string temp;
        std::getline(is, temp);
        a.answer = boost::lexical_cast<int>(temp);
        return is;
    }
};

使用它,从文件中读取数据可能如下所示:

std::vector<answer> answers{
    std::istream_iterator<question>(questionFile),
    std::istream_iterator<question>()};

这将从文件中读取数据,并将其读取的项目放入我名为answers的矢量中。

虽然我们正在使用它,但我还要更改代码以打开文件,至少是一点点。 ios::app只有在您要写入文件时才真正有意义,而不仅仅是从文件中读取。其次,选择硬编码文件名的案例陈述似乎有点笨拙,至少对我而言。

我可能更喜欢写这部分代码:

if (x<0 || x > 4)
    throw std::runtime_error("prohibited file name");

std::stringstream name << "Topic" << x << " Questions.txt";
std::ifstream questionFile(name.str());