我一直在想,堵塞有什么意义?据我所知,阻塞与cerr相同,但具有缓冲功能,因此效率更高。通常stderr与stdout相同,所以阻塞与cout相同。这在我看来是很差劲的,所以我想我一定是误会了。如果我将日志消息发送到与我发出的错误消息相同的位置(可能是在/var/ log / messages中),那么我可能不会写太多(所以使用非缓冲的cerr不会丢失太多)。根据我的经验,我希望我的日志消息是最新的(而不是缓冲的),这样我就可以帮助查找崩溃(所以我不想使用缓冲阻塞)。显然我应该一直使用cerr。
我想在我的程序中重定向阻塞。重定向cerr将非常有用,这样当我调用库例程时,我可以控制cerr和clog的位置。有些编译器能支持这一点吗?我刚刚检查了DJGPP,stdout被定义为文件结构的地址,所以执行诸如"stdout =freopen(.)“之类的操作是非法的。
发布于 2008-09-09 17:13:03
是否可以重定向阻塞、cerr、cout、stdin、stdout和/或stderr?
是。您需要rdbuf函数。
ofstream ofs("logfile");
cout.rdbuf(ofs.rdbuf());
cout << "Goes to file." << endl;阻塞和缓冲之间唯一的区别是?
据我所知是的。
发布于 2008-09-09 17:16:52
如果您是在posix shell环境中(我真的在考虑bash),您可以将任何文件描述符重定向到任何其他文件描述符,因此要重定向,只需:
$ myprogram 2>&5 将stderr重定向到由fd=5表示的文件。
编辑:再想一想,我更喜欢康拉德·鲁道夫关于重定向的回答。rdbuf()是一种更加连贯和可移植的方法。
至于日志记录,嗯.我从std库中没有的所有东西的Boost库开始。看:Boost测井v2
编辑:Boost日志记录不是Boost库的一部分;它已经过审查,但没有被接受。
编辑:2年后,早在2010年5月,Boost就接受了一个日志库,现在名为Boost.Log。
当然,也有其他选择:
还有Windows事件记录器。
还有一些可能有用的物品:
发布于 2019-05-25 20:00:44
由于这里有几个关于重定向的答案,我将添加最近偶然发现的关于重定向的这个漂亮的宝石:
#include <fstream>
#include <iostream>
class redirecter
{
public:
redirecter(std::ostream & dst, std::ostream & src)
: src(src), sbuf(src.rdbuf(dst.rdbuf())) {}
~redirecter() { src.rdbuf(sbuf); }
private:
std::ostream & src;
std::streambuf * const sbuf;
};
void hello_world()
{
std::cout << "Hello, world!\n";
}
int main()
{
std::ofstream log("hello-world.log");
redirecter redirect(log, std::cout);
hello_world();
return 0;
}它基本上是一个重定向类,允许您重定向任意两个流,并在完成后恢复它。
https://stackoverflow.com/questions/52357
复制相似问题