我一定要倒退,但是
Do I have to set back rdbuf
本文关键字:但是 更新时间:2023-10-16
此代码的目的是支持通过./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的数据库而不设置其原始数据库时,是否有任何资源泄漏?
您正确地建议将读取包装到一个单独的函数中,该函数将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";
快速回答:
可以,如果要在程序结束前再次使用的话。
您可能应该保存原始的std::cin.rdbuf()
,然后将其重定向到您的工作,最后恢复其原始值。
在重定向前使用这一行:
std::streambuf *cinbuf = std::cin.rdbuf();
,然后这个重置:
std::cin.rdbuf(cinbuf);
相关文章:
- std::map<struct,struct>::find 找不到匹配项,但是如果我循环通过 begin() 到 end(),我在那里看到匹配项
- 当我在第一个循环中使用"auto"时,它工作正常,但是使用"int"它会给出错误,为什么?
- 代码在我的计算机上运行良好,但是在将其提交给coursera时遇到未知的信号11问题
- 我有三个 getline,但是一旦编译,输入就太多了
- 我要求用户输入大小和数组,但是当我打印矢量时,它仅显示'0'作为输出
- 我在 C++ 中创建了一个函数来递归反转字符串,但是之后如何使功能打印一个 endl?
- 如果我们在其中输入一个整数,则字符会给出整数作为输出,但是当分配给它一个整数时,这不会发生。为什么?
- 使用Visual Studio 2012编译时,此代码会给我错误,但是使用代码块就可以了
- 错误:类没有名为"ThisW"的成员;你是说"这个"吗?但是代码没有说"ThisW",它已经说了"This"
- 为什么完整的字符串没有一次打印,但是当我尝试逐个字符打印时
- 我已经创建了一个模板函数,但是在检查输入是奇数还是偶数时收到错误 C++.
- 我收到一个断言错误,但是当我编写 cout 语句时,它会消失
- C++ .我正在尝试通过使用开关内的数组来获取用户输入,但是当我运行代码时,它显示分段错误?
- c++curl返回413请求实体过大,但是post大小远小于max大小
- 我想覆盖运算符'='但是在重载之后,运算符没有将正确的信息传递给对象
- tensorflow:transpose需要一个大小为1的向量.但是输入(1)是大小为2的向量
- 我正在努力处理多维数组输入和输出,我管理输入,但是打印无法按计划工作
- 我正在编写一个代码来将 int 数组存储在文件中,然后用 c++ 检索它,但是检索第一项是假值,我该如何解决这个问题?
- C++11: 如何编写一个像 Get 一样工作的模板函数<tuple>...但是收到参数包?
- 应该是虚拟析构函数吗?但是怎么做呢?