gpt4 book ai didi

c++ - cout、cerr、clog的rdbuf改成重定向到文件后,是否需要重新设置?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:35:29 28 4
gpt4 key购买 nike

在试图弄清楚如何回答 https://stackoverflow.com/questions/33601384/what-is-the-file-descriptor-of-linuxs-environments-standard-logging-stream 时, 我注意到一个链接 an answer to a related SO post .我用 g++ 4.8.4 尝试了上面链接答案中的代码,但在程序终止之前出现了段错误。

程序如下:

#include <iostream>
#include <fstream>

int main()
{
std::ofstream of("cout.txt");
std::cout.rdbuf(of.rdbuf());
std::cout << "test. test. test." << std::endl;
return 0;
}

构建程序的命令:

g++ -Wall -std=c++11  -g   socc.cc   -o socc

gdb 的输出:

GNU gdb (Ubuntu 7.7.1-0ubuntu5~14.04.2) 7.7.1
Copyright (C) 2014 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law. Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-linux-gnu".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>.
Find the GDB manual and other documentation resources online at:
<http://www.gnu.org/software/gdb/documentation/>.
For help, type "help".
Type "apropos word" to search for commands related to "word"...
Reading symbols from socc...done.
(gdb) run
Starting program: /.........../socc (removed some text here)
Traceback (most recent call last):
File "/usr/share/gdb/auto-load/usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.19-gdb.py", line 63, in <module>
from libstdcxx.v6.printers import register_libstdcxx_printers
ImportError: No module named 'libstdcxx'

Program received signal SIGSEGV, Segmentation fault.
0x000000000040073c in ?? ()
(gdb) bt
#0 0x000000000040073c in ?? ()
#1 0x0000000000000000 in ?? ()
(gdb)

我更新了程序以保留 cout 的旧 rdbuf 并在程序结束前重置它。

#include <iostream>
#include <fstream>

int main()
{
std::ofstream of("cout.txt");
auto cout_buff = std::cout.rdbuf();
std::cout.rdbuf(of.rdbuf());
std::cout << "test. test. test." << std::endl;
std::cout.rdbuf(cout_buff);
return 0;
}

有了这个改动,程序运行没有任何问题。

我对 cerrclog 进行了类似的实验,结果相同。

这引出了我的问题:

如果coutcerrclog改变了,是否总是需要重新设置rdbuf被重定向到一个文件?

如果不是,这是 g++ 缺陷吗?

最佳答案

引自 The C++ Standard Library - A tutorial and reference Nicolai Josuttis 的第 2 版,

Ch。 15.12.13,重定向标准流 pp. 822

...

std::cout.rdbuf (file.rdbuf());

Caution! The object file is local and is destroyed at the end of the block. This also destroys the corresponding stream buffer. This differs from the “normal” streams because file streams allocate their stream buffer objects at construction time and destroy them on destruction. Thus, in this example, cout can no longer be used for writing. In fact, it cannot even be destroyed safely at program termination. Thus, the old buffer should always be saved and restored later!

所以答案似乎是肯定的,尽管我没有标准的引述,但上面的作者是一位专家。

关于c++ - cout、cerr、clog的rdbuf改成重定向到文件后,是否需要重新设置?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33601886/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com