我一定要倒退,但是

Do I have to set back rdbuf

本文关键字:但是      更新时间:2023-10-16

此代码的目的是支持通过./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的数据库而不设置其原始数据库时,是否有任何资源泄漏?

您正确地建议将读取包装到一个单独的函数中,该函数将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";

快速回答:

可以,如果要在程序结束前再次使用的话。

您可能应该保存原始的std::cin.rdbuf(),然后将其重定向到您的工作,最后恢复其原始值。

在重定向前使用这一行:

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

,然后这个重置:

std::cin.rdbuf(cinbuf);   
相关文章: