我是否必须退回rdbuf

时间:2015-09-29 16:48:46

标签: c++

此代码的目的是支持./a.out < input_file_name./a.out input_file_name运行我的代码。我知道我可以将我的阅读部分包装到带有参数iostream&的单独函数中,因此我可以传递ifstreamcin,具体取决于argc == 2

int main(int argc, char* argv[]) {
if (argc != 1 && argc != 2) {
    cerr << "usage file or <file" << endl;
}

ifstream in;
if (argc == 2) {
    in.open(argv[1]);
    cin.rdbuf(in.rdbuf());
}

string line;
while (getline(cin, line))
    cout << line << "\n";
}

我上面的琐碎代码总是使用cin读取内容。我是否需要将cin设置回其原始rdbuf

我发现的一些代码示例总是将rdbuf设置为原始值。我们必须吗?更换cin或cout的rdbuf时是否有任何资源泄漏而没有在以后重置原来的rdbuf?

2 个答案:

答案 0 :(得分:2)

您正确建议将读取包装到单独的函数中,该函数将incin作为参数传递。那将是最好的解决方案。

除此之外,回答你的问题:你不需要把它归还;但你可能会这样伤害其他用户。使用cin从某个文件中读取是非常意外的。在您的计划中使用cin的以下用户将很难正常使用cin。如果你想保留你的代码,你可能应该重新设置它。

为什么不执行以下操作(完全放弃cin):

ifstream in;
if (argc > 2) {
    in.open(argv[1]);
}
istream & input = (argc > 2 ? in : cin);

string line;
while (getline(input, line))
    cout << line << "\n";

答案 1 :(得分:0)

快速回答:

  

是的,如果它将在节目结束前再次使用。

您应该保存原始std::cin.rdbuf(),然后重定向它以完成工作并最终恢复其原始值。

在重定向之前只需使用此行:

std::streambuf *cinbuf = std::cin.rdbuf(); 

然后重置:

std::cin.rdbuf(cinbuf);