【问题标题】:File stream into Object vector文件流到对象向量
【发布时间】:2018-01-28 02:41:06
【问题描述】:
class Question
{
public:

    void showQuestion();
    bool checkAnswer(string givenAnswer);
    void showAnswer();
    void markCorrect();

private:

    string level;
    string questionText;
    string answerText;
    bool correct;
};

class Quiz
{
public:

    bool loadQuestions(string dataFileName);
    void dumpQuestions();
    int deliverQuiz();

private:

    vector<Question> questions;

};

我在这里有两个课程,问题和测验,我需要阅读一个包含问题、答案等的文本文件。读取文件后,我需要将变量存储到向量中。我尝试了几件事,创建了一个 Question 对象向量并将它们存储在其中。但是,我相信我需要创建一个 Quiz 对象并将它们存储在私有向量中。我很困惑如何将变量存储到 Quiz 矢量对象中,或者它的语法是什么样的。

换句话说,对我来说创建一个问题对象向量并将它们存储在其中是有意义的。但是看来我需要创建一个测验对象向量,并将变量存储在其中,我只是不确定如何去做。

这是我的输入文件格式的示例,名为 questions.txt

S|1|What is the capital of Italy|Rome
S|1|What is the capital of France|Paris

【问题讨论】:

  • 您的问题文件是什么样的(格式是什么)?请提供数据的简要示例。 (将其放入您的原始问题中,而不是作为评论)
  • pastebin.com/LUqQyw9K, - 文本文件问题示例,然后解析文件的方法。
  • 您的Question 对象向量已归Quiz 所有,您将其命名为questions。我认为您在这里不需要任何其他向量。在成员变量名称的开头使用mm__ 是有意义的,这样在方法中使用它们时就不会感到困惑。

标签: c++ class object vector


【解决方案1】:

不过,我似乎需要创建一个测验对象向量,并将变量存储在其中

我认为你不需要这样做。在您的示例中,您有 1 个拥有许多问题的测验。这是有道理的,所以我认为您不需要创建 Quiz 对象向量。

我需要读取一个包含问题、答案等的文本文件。读取文件后,我需要将变量存储到向量中。

这是一种通过实现您定义的Quiz::loadQuestions() 方法来填充Question 对象向量的方法。您需要提供对 Question 对象的私有成员的访问权限,以便正确检索和填充它们(提供访问器和修改器)。

void Question::setLevel( const int theLevel )
{
   level = theLevel;
}

void Question::setQuestion( const std::string & question )
{
   questionText = question;
}

等等。完成此操作并给定输入文件格式后,您可以像这样填充。

bool Quiz::loadQuestions( const std::string & fileName )
{
    std::ifstream infile(fileName.c_str());
    if (infile.is_open())
    {
        std::string line;
        while (std::getline(infile, line))
        {
            std::stringstream ss(line);
            std::string token;
            Question temp;

            std::getline(ss, token, '|'); // Type (don't care?)
            std::getline(ss, token, '|'); // Level
            int level = atoi(token.c_str());
            temp.setLevel(level);

            std::getline(ss, token, '|'); // Question
            temp.setQuestion(token);

            std::getline(ss, token, '|'); // Answer
            temp.setAnswer(token);

            // store populated Question object for Quiz
            questions.push_back(temp);
        }
    }
    return (!questions.empty());
}

【讨论】:

  • 好的,非常感谢你,让访问器功能与众不同!这更有意义。
  • @CodeSpyder 不客气!如果它对你有用,请接受我的回答。
猜你喜欢
  • 2013-02-22
  • 2012-09-21
  • 2016-03-14
  • 1970-01-01
  • 2018-03-23
  • 1970-01-01
  • 2023-03-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多