我对 stdout
有这个奇怪的问题/stderr
.
我想为无法将原始代码放在这里而道歉,它太长/依赖的库太多等等...
因此,如果您遇到过类似的事情,或者在没有获得原始代码的情况下可能导致此问题的原因,请告诉我,只有我尝试做的简单事情的想法和示例:
- 我正在使用
g++ (GCC) 4.4.6 20120305 (Red Hat 4.4.6-4)
在RHEL 6.3
- 我无法将它放在这里隔离问题,我将给出我所做的代码示例。
-
fprintf() / printf() / std::cout
一段时间后停止工作。 我正在使用boost::asio::io_service
与deadline_timer
为了调用my_print()
功能。
这my_print()
函数每隔1 second
打印到屏幕一些信息。
为了打印,我使用对齐方式,如下所示:
fprintf(stdout, "%*s\n", -printWidth, someEnumToStr[i]);
fprintf(stdout, "%s\n", aString);
fprintf(stdout, "%u\n", num);
同时 aString
是 std::string
.有时我构造 aString
来自 std::ostringstream
.
有时我用 snprintf()
构造它.
- 我有一个
std::map
有了信息, map 中正好有 16 个元素。我遍历它,对于每个元素,我尝试使用fprintf()
的示例打印数据以上。 - 由于未知原因,元素行
16
未打印。 - 如果我调用可执行文件,并重定向
stdout
到文件 (./a.out > aaa.txt
) 元素行16
正在打印。 - 如果我打开一个新的
FILE*
和fprintf()
对于这个文件,再次打印所有内容(所有行,包括元素16
的行) - 使用前
fprintf()
我尝试使用std::cout
(和对齐std::cout.width(printWidth) << std::left
...),同样的行为发生了,但是当行16
没有画,stdout
卡住了(我的意思是,该程序仍然有效,但没有任何内容打印到stdout
再也没有。我不得不调用std::cout.clear()
让它再次工作)。由于代码中的一点,我无法掌握,std::cout.failbit
和badbit
是1
. - 如果我用
valgrind
运行代码这种行为不会发生。valgrind
没有说错什么。 - 如果我用
gdb
运行它它发生了,但是gdb
没有说错什么。 - 如果我在 IDE (
clion
) 中以 Debug模式运行它,它不会发生。 - 如果我在 IDE 中运行它而不进行调试,它就会发生。
- 我认为这取决于
printWidth
我给出了fprintf()
中的对齐方式- 当printWidth
越大,发生得越快(当它越小时,16
行会随机打印)。 - 另一件重要的事情:当有更多要打印时,它会更频繁地发生。
- 我试着给
std::cout
一个更大的缓冲区(不是他的默认值)但它没有用。 - 我试图将所有输出缓冲到缓冲区中(而不是打印每一行),然后只缓冲到
fprintf()
一次。发生相同的行为。 - 我在尝试打印
NULL
的代码中没有找到任何地方指针。 - 我用
\n
打印每对fprintf()s
,然后做fflush()
在my_print()
结束
如果你知道什么请告诉我。
插图:
deadline_timer..... every 1 sec... my_print()
boost::asio::io_service.run
my_print() {
for(std::map<>::iterator... begin, end, ++it....) {
fprintf()s....
}
}
最佳答案
不可打印的字符可能会破坏终端。
fprintf(stdout,"%s", astdstring.cstr());
就是如何打印std::string
关于c++ - fprintf()/std::cout 不会将字符串的一部分打印到 stdout/stderr,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32508801/