所以下面代码底部的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();
}
答案 0 :(得分:1)
getline
和operator>>
从文件中提取但getline
读取直到'\ n'(或您指定的任何字符),而operator>>
读取直到空格。此外,operator>>
将在流中保留'\ n',导致getline
的下一次调用无法读取。
阅读getline
和operator>>
文档了解更多详情(这些是链接)。
此外,发布问题/答案存储在文件中的格式,因为代码的运行方式非常依赖于此。如果您只是期待交替的问题和答案,只需使用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());