Nico 的答案对您来说可能是一条更好的路径,但对于那些更喜欢更惯用的方法的人,我推荐一个行向量,一旦存储,您就可以轻松地向后打印。首先是一个Line
类,您可以使用它来习惯性地读取输入行,而不是停在空格处:
struct Line {
std::string str;
};
std::istream &operator>>(std::istream &in, Line &line) {
std::getline(in, line.str);
if (line.str == "stop") {
in.clear(std::ios::failbit);
}
return in;
}
std::ostream &operator<<(std::ostream &out, const Line &line) {
out << line.str;
return out;
}
我们Line
所需要的只是一个带有实际文本的字符串,并且我已经为它添加了输入和输出支持,原因您将在接下来看到。请注意,输入是 throughgetline
而不是>>
。这是Line
上课的主要目的。当输入“停止”时,我也让它失败了。如果省略,它将继续读取直到 EOF。
现在,您可以毫不费力地重用 line 类,以便根据需要调整输入。接下来,我们开始使用我们刚刚创建的(或者可能是其他东西留下的):
int main() {
std::istream_iterator<Line> in1(std::cin), in2;
std::vector<Line> inputs(in1, in2);
std::reverse_copy(std::begin(inputs), std::end(inputs), std::ostream_iterator<Line>(std::cout, "\n"));
}
我们做的第一件事是通过读取输入来形成一个向量(使用我们对 的输入支持Line
)。当到达文件末尾或输入“停止”时,它将停止,并且每一行输入都将很好地存储在我们的向量中。
接下来,我们调用reverse_copy
将向量中的所有内容(输入的每一行)复制到标准输出,用换行符分隔,但都是反向完成的,所以我们以相反的顺序结束每一行。
就是这样!一旦创建了Line
类,获取行输入并反转它们的算法可以保持与我们使用单词执行的相同,但是切换到行只需要替换一些std::string
with实例Line
。