[英]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.