此代码的目的是支持./a.out < input_file_name
或./a.out input_file_name
运行我的代码。我知道我可以将我的阅读部分包装到带有参数iostream&
的单独函数中,因此我可以传递ifstream
或cin
,具体取决于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?
答案 0 :(得分:2)
您正确建议将读取包装到单独的函数中,该函数将in
或cin
作为参数传递。那将是最好的解决方案。
除此之外,回答你的问题:你不需要把它归还;但你可能会这样伤害其他用户。使用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);