将COUT从C 中的各种来源重定向到同一文件
Redirecting cout into same file from various sources in c++
我的问题是我在项目中的各个文件中都有几个cout。我希望所有这些都被重定向并保存在 .txt 文件中,而我现在所取得的成就是,只有一个cout保存在文件中。为了一次读取它们,我不想为每个 cout 创建单独的 .txt 。我的代码现在看起来像这样:
#include <fstream>
#include <string>
#include <iostream>
int main()
{
std::ofstream out("out.txt");
std::cout.rdbuf(out.rdbuf());
std::cout << "get it3";
std::cout << "get it4";
}
两个 cout 都在一个文件中,但是假设它们有两个不同,如何重定向并保存在一个 .txt ?
明显的答案是,您永远不要输出 std::cout
。所有实际输出都应是std::ostream&
,默认情况下可以将其设置为std::cout
,但是您可以也要初始化其他事物。
另一个明显的答案是重定向之前应在开始过程。
但是,假设您无法更改代码输出到std::cout
,您无法控制您的程序(或者您只想更改某些输出),您可以通过附加来更改std::cout
本身的输出不同的streambuf
。在这种情况下,我也会使用raii确保当您退出时,std::cout
具有streambuf期望。但是类似以下内容应该有效:
class TemporaryFilebuf : public std::filebuf
{
std::ostream& myStream;
std::streambuf* mySavedStreambuf;
public:
TemporaryFilebuf(
std::ostream& toBeChanged,
std::string const& filename )
: std::filebuf( filename.c_str(), std::ios_base::out )
, myStream( toBeChanged )
, mySavedStreambuf( toBeChanged.rdbuf() )
{
toBeChanged.rdbuf( this );
}
~TemporaryFilebuf()
{
myStream.rdbuf( mySavedStreambuf );
}
};
(您可能需要添加一些错误处理;例如无法打开文件。)
进入要重定向输出的区域时,用流(std::cout
或任何其他 ostream
)和文件的名称。当实例是破坏了,输出流将恢复输出无论何时输出之前。
相关文章:
- 获取通过重定向传入的输入文件的名称?
- 写入文件 a.txt,而终端重定向到文件 b.txt
- 将 clangd stderr 重定向到文件而不是控制台
- 是否可以将子进程的 stdout 重定向到父进程中的另一个文件?
- 重定向输入和输出时如何处理主文件I/O?
- 使用重定向命令从 stdin 读入的字符串"<"输入文件未正确附加
- 可以将Boost消息队列文件重定向到用户指定的位置
- 如何使用PHP将上传到本地主机的一个html文件重定向到磁盘上的另一个html文档
- 尝试将 std::cerr 重定向到文件时出现访问冲突异常
- 重定向到文件的C ++ COUT比使用Ofstream慢
- 将 Tcl 中的命令输出重定向到文件时,文件以 DOS 格式生成
- 将 c++ 程序语法错误重定向到窗口中的文件
- 如何在没有任何缓冲区的情况下将 stderr 重定向到文件?
- 将 ffmpeg 控制台输出重定向到C++中的字符串或文件
- Win32 GUI C(++) 应用将标准输出和标准输出重定向到磁盘上的同一文件
- 即使可执行文件的输入是从文件重定向的,如何强制从终端输入?
- C++输入重定向导致文件参数工作时出错
- C++ vector<pair<int,int>> std::all_of() 函数问题(重定向到头文件)
- 重定向文件访问
- Boost.IOStreams:如何使用"rdbuf"正确重定向文件流?