Muh*_*idi 5 c++ redirect c++11
在我生命的大部分时间里,我一直在使用cstdio.现在我想转移到iostream.
假设我有一个名为"foo.cpp"的独立程序,如下所示:
int main(){ // foo.cpp
int x;
std::cin >> x;
std::cout << x + 5 << "\n";
}
Run Code Online (Sandbox Code Playgroud)
在另一个名为"bar.cpp"的程序中,我调用了foo可执行文件.在过去,如果我想将stdin和stdout重定向到一个文件,我会这样使用freopen:
int main(){ // bar.cpp, redirecting stdin and stdout
freopen("foo.in", "r", stdin); // Suppose "foo.in" contains a single integer "42"
freopen("foo.out", "w", stdout);
system("foo.exe"); // "foo.out" will contain "47"
}
Run Code Online (Sandbox Code Playgroud)
现在我想重定向std::cin并std::cout以stringstreams.像这样的东西:
int main(){ // bar.cpp, redirecting cin and cout
std::istringstream instr("62");
std::ostringstream outstr;
std::cin.rdbuf(instr.rdbuf());
std::cout.rdbuf(outstr.rdbuf());
system("foo.exe"); // outstr should contain "67"
}
Run Code Online (Sandbox Code Playgroud)
但我所学到的是,std::cin并且std::cout在执行"foo.exe"时没有被重定向.该程序现在预计用户输入并将打印到std::cout.当"foo.exe的"的执行已完成,std::cin而std::cout内"bar.cpp"仍然存在重定向到instr和outstr分别.
我的问题是,有没有办法iostream像我想的那样做,或者我坚持使用freopen?
freopen好久没看到电话了。这勾起了一些旧的回忆。
无论如何,我认为你应该坚持下去freopen。该函数的文档页面字面意思是这是主要用例之一:
此函数对于将stdin、stdout和stderr等预定义流重定向到特定文件特别有用。
我认为您不能iostream仅使用重定向,因为该iostream库没有该函数的等效项freopen。
有趣的是,为什么您尝试的这个解决方案不起作用:
std::cin.rdbuf(instr.rdbuf());
std::cout.rdbuf(outstr.rdbuf());
Run Code Online (Sandbox Code Playgroud)
也许通过这两行,您只会影响当前进程的rdbufstd::cin和,并且子进程有另一个和实例。std::coutstd::cinstd::cout
调用时,有关文件的信息似乎从父进程复制到子进程system。这就是为什么您在主进程中对stdin和stdout所做的更改freopen也在子进程中可见。
无论如何,您不应该使用系统来运行主 C++ 程序中的子程序。由于您可能使用的是 Windows(根据参考资料猜测foo.exe),我将分析Microsoft 的这个示例。它解释了如何创建子进程并使用管道来重定向子程序的输入和输出。
| 归档时间: |
|
| 查看次数: |
578 次 |
| 最近记录: |