簡體   English   中英

C++:來自外部文件的瑣事

[英]C++: Trivia from external file

我有這個代碼,它工作正常。 我需要包括以“?”分隔的問題和答案在一個外部文本文件中,我需要一些幫助。

現在我有以下問題和答案:

trivia.setQuestion("Who is the patron saint of Ireland?");
        trivia.setAnswer("St. Patrick");
        trivia.setAmount(2);
        triviaList.push_back(trivia);

        trivia.setQuestion("Name Batman’s crime fighting partner?");
        trivia.setAnswer("Robin");
        trivia.setAmount(10);
        triviaList.push_back(trivia);

        trivia.setQuestion("What is the name of Peppa Pig’s brother?");
        trivia.setAnswer("George");
        trivia.setAmount(5);
        triviaList.push_back(trivia);

編輯:我想將問題傳遞給 setQuestion(),並將答案傳遞給 setAnswer()

trivia.text
Who is the patron saint of Ireland? St. Patrick
Name Batman’s crime fighting partner? Robin
What is the name of Peppa Pig’s brother? George

我知道我需要實現這一點:

string line;
cout << "Enter input: ";
getline(cin, line, "?");

當然還可以打開和關閉 trivia.text,但是我如何像本地人一樣提出問題和答案?

任何幫助將不勝感激,提前致謝!!

#include <iostream>
#include <string>
#include <fstream>
#include <vector>
using namespace std;
class TriviaGame {

public:
    TriviaGame();
    TriviaGame(string question, string answer, int amount);
    ~TriviaGame() {};
    string getQuestion();
    void setQuestion(string newQuestion);
    string getAnswer();
    void setAnswer(string newAnswer);
    int getAmount();
    void setAmount(int newAmount);

private:
    string question;
    string answer;
    int amount;
};

TriviaGame::TriviaGame() {
    question = "";
    answer = "";
    amount = 0;
}

TriviaGame::TriviaGame(string question, string answer, int amount) {
    this->question = question;
    this->answer = answer;
    this->amount = amount;
}

string TriviaGame::getQuestion() {
    return question;
}

void TriviaGame::setQuestion(string newQuestion) {
    question = newQuestion;
}

string TriviaGame::getAnswer() {
    return answer;
}

void TriviaGame::setAnswer(string newAnswer) {
    answer = newAnswer;
}

int TriviaGame::getAmount() {
    return amount;
}

void TriviaGame::setAmount(int newAmount) {
    amount = newAmount;
}

    // main function
int main() {
    vector<TriviaGame> triviaList;
    TriviaGame trivia;

    // === Input Stream ===
    fstream inputStream;
    inputStream.open("trivia.txt");
    if(!inputStream.is_open()) {
        cout << "File not found!\n";
        exit(0);
    }
    else {
        string line;

   // while(getline(inputStream, line, "?")){
        while(getline( inputStream, line, '?')) {

trivia.setQuestion(line);
trivia.setAnswer("St. Patrick");
trivia.setAmount(2);
triviaList.push_back(trivia);

trivia.setQuestion(line);
trivia.setAnswer("Robin");
trivia.setAmount(10);
triviaList.push_back(trivia);

trivia.setQuestion(line);
trivia.setAnswer("George");
trivia.setAmount(5);
triviaList.push_back(trivia);
    int winnings = 0;
    cout << "Trivia Game!" << endl;
    for (int i=0; i < triviaList.size(); i++)
    {
        cout << "You have $" << winnings << endl;
        cout << triviaList[i].getQuestion() << endl;
        string answer;
        getline(cin, answer);
        if (answer == triviaList[i].getAnswer())
        {
            cout << "That's right!  You win $" <<
            triviaList[i].getAmount() << endl;
            winnings += triviaList[i].getAmount();
        }
        else
        {
            cout << "Sorry, the correct answer is: " <<
            triviaList[i].getAnswer() << endl;
        }
    }
    cout << "Game over.  Your total winnings are: $" << winnings;

    cout << endl;
}

你已經意識到你需要做什么:

getline(cin, line, "?");

您只需要查看std::getline詳細信息並發現它應該采用char ,而不是const char* (都不是std::string )作為分隔符。 只需替換"?" '?' .

我准備了一個簡短的例子,你如何使用它:

int main() {
    std::istringstream input{"The question? The answer.\n"
                             "Another question? Another answer.\n"
                             "What is 2+2? Definitely 4.\n"};

    std::string question{};
    std::string answer{};

    while(std::getline(input, question, '?') &&
          std::getline(input, answer)) {
        std::cout << "Q: " << question << " A: " << answer << '\n';
    }
}

在上面的例子中,你有兩個std::string s - 一個保存問題,另一個保存答案

不要忘記為std::istringstream #include <sstream> 如果您不知道std::istringstream是什么,您可以單擊上面的鏈接,或者std::istringstream假設它只是一個“硬編碼的std::cin ”。 它的行為類似於輸入流(就像std::cin ),但可以使用const char*std::string進行初始化。

要讓您的代碼改用標准輸入,只需刪除std::istringstream部分並將input替換為std::cin

要使您的代碼與文本文件一起使用,請閱讀std::ifstream1 它的行為非常像std::cin (因為它們都是輸入流)。 創建std::ifstream對象,將其命名為input (或您喜歡的任何名稱)並像對待std::cin一樣對待它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM