如何将 cin
重定向到 in.txt
和 cout
到 out.txt
?
原文由 updogliu 发布,翻译遵循 CC BY-SA 4.0 许可协议
如何将 cin
重定向到 in.txt
和 cout
到 out.txt
?
原文由 updogliu 发布,翻译遵循 CC BY-SA 4.0 许可协议
接受的答案显示了重定向 cin
和 cout
的正确方法。您需要构造另一个生命周期超过 cin
或 cout
的流对象。如果你想写一个类似 freopen
的函数,你可以为每个要重定向的流分配一个数组,以保存分配的流对象。
#include <iostream>
#include <string>
#include <fstream>
#include <vector>
using namespace std;
template<typename>
struct fstream_traits { };
template<typename CharT, typename Traits>
struct fstream_traits<basic_istream<CharT, Traits>> { using type = basic_ifstream<CharT, Traits>; };
template<typename CharT, typename Traits>
struct fstream_traits<basic_ostream<CharT, Traits>> { using type = basic_ofstream<CharT, Traits>; };
template <typename Stream>
void redirect(Stream& str, string filename)
{
using fstream_type = typename fstream_traits<Stream>::type;
static int index = std::ios_base::xalloc();
if (str.pword(index) == nullptr)
{
str.pword(index)= new vector<ios_base*>{};
str.register_callback([](ios_base::event event, std::ios_base& stream, int index) {
if (event == ios_base::erase_event)
{
for (auto fs : *(vector<ios_base*>*)stream.pword(index))
delete fs;
delete (vector<ios_base*>*)stream.pword(index);
}
}, index);
}
vector<ios_base*>* list = (vector<ios_base*>*)str.pword(index);
list->push_back(new fstream_type{filename});
str.rdbuf(dynamic_cast<fstream_type*>(list->back())->rdbuf())->~basic_streambuf();
}
int main()
{
redirect(cout, "out.txt");
cout << "Redirected text!";
return 0;
}
如果您明确使用 istream
/ ostream
而不是 Stream
,则不需要模板和别名。
原文由 Tuff Contender 发布,翻译遵循 CC BY-SA 4.0 许可协议
3 回答2k 阅读✓ 已解决
2 回答3.9k 阅读✓ 已解决
2 回答3.2k 阅读✓ 已解决
1 回答3.2k 阅读✓ 已解决
1 回答2.7k 阅读✓ 已解决
3 回答3.4k 阅读
1 回答3.3k 阅读
这是您想要做的一个工作示例。阅读注释以了解代码中每一行的作用。我已经在我的电脑上用 gcc 4.6.1 测试过它;它工作正常。
您可以在一行中 保存 并 重定向 为:
这里
std::cin.rdbuf(in.rdbuf())
设置std::cin's
缓冲区为in.rdbuf()
然后返回与std::cin
关联的旧缓冲区std::cout
或任何 流 也可以做到这一点。希望有帮助。