作为一个noob C++项目,我正在构建一个依赖用户输入的游戏循环的CLI游戏。为了测试的目的,我希望能够将文件名作为命令行参数传递给程序,它将被视为“像标准输入”,直到它被读取。流对象代表文件输入,然后标准输入?
因此,我需要一种方法来封装代表一个文件的内容然后std::cin
一旦该文件已被阅读过的对象 - 基本上前面加上一个文件的内容标准输入。至少,这似乎将是非常好的,让我能避免类似
std::istringstream retrieve_input(std::ifstream &file) {
std::string line;
if (std::getline(file, line))
return std::istringstream{line};
std::getline(std::cin, line);
return std::istringstream{line};
}
与某种自定义类的一个好方法代替呢?或者我可以用std::cin
搞砸我的文件内容吗?
澄清:我的游戏循环可能有20次迭代。如果我用五行传递一个文件,我想在游戏循环的前五个迭代中使用这五行,然后回到剩下的十五行的标准输入。我明白如何在一系列条件下做到这一点,但我认为在班级中必须有一种很好的方式来实现这种行为。我的问题是 - 它应该继承什么? std::streambuf
?原则上这是一个好主意吗?
我(可能是坏的尝试)
class InputGrabber {
public:
virtual std::istringstream retrieve_line() = 0;
virtual ~InputGrabber() {}
};
class BaseInputGrabber : public InputGrabber {
public:
BaseInputGrabber(std::istream &_in): in{_in} {}
std::istringstream retrieve_line() override {
std::string line;
std::getline(in, line);
return std::istringstream{line};
}
private:
std::istream ∈
};
class VarInputGrabber : public InputGrabber {
public:
VarInputGrabber(std::istream &_in, const std::string &f_name) :
in{_in}, init{std::ifstream(f_name)} {}
std::istringstream retrieve_line() override {
std::string line;
if (std::getline(init, line)) {
return std::istringstream{line};
}
std::getline(in, line);
return std::istringstream{line};
}
private:
std::istream ∈
std::ifstream init;
};
@Ron不同意。一些标准库类意味着被继承。 'std :: streambuf'就是一个例子。 –
@Ron你能区分“一些”和“全部”的概念吗? –