我知道你不应该将打印与printf,cout和wprintf,wcout混合,但很难找到一个好的答案为什么以及是否有可能绕过它。问题是我使用一个外部库,用printf打印,我自己使用wcout。如果我做一个简单的例子它工作正常,但从我的完整应用程序它只是不打印printf语句。如果这确实是一个限制,那么会有许多库无法与广泛的打印应用程序一起工作。对此的任何见解都非常受欢迎。
更新:
我把它归结为:
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <readline/readline.h>
#include <readline/history.h>
int main()
{
char *buf;
std::wcout << std::endl; /* ADDING THIS LINE MAKES PRINTF VANISH!!! */
rl_bind_key('\t',rl_abort);//disable auto-complete
while((buf = readline("my-command : "))!=NULL)
{
if (strcmp(buf,"quit")==0)
break;
std::wcout<<buf<< std::endl;
if (buf[0]!=0)
add_history(buf);
}
free(buf);
return 0;
}
所以我想这可能是一个冲动的问题,但它对我来说仍然很奇怪,我必须检查它。
更新 - &gt;解决方法:
首先,wprintf出现同样的问题。但我发现添加:
std::ios::sync_with_stdio(false);
实际上做了诀窍......(注意错误而不是我所期望的那样......),唯一令我烦恼的是,我不明白为什么以及如何弄明白: - (
答案 0 :(得分:6)
你应该能够混合它们,但它们通常使用单独的缓冲机制,因此它们相互重叠:
printf("hello world");
cout << "this is a suprise";
可能导致:
hellothis是一个令人惊讶的世界
您没有提供足够的信息来诊断您的应用程序中的printf()问题,但我怀疑您有多个c运行时(代码中有一个,printf()代码中有一个)并且有一个冲突。
答案 1 :(得分:5)
我认为你在讨论的是std::ios_base::sync_with_stdio
,但是它默认情况下是IIRC。
答案 2 :(得分:2)
printf()和cout缓冲区默认是同步的,或者实际上是相同的缓冲区。如果您遇到缓冲问题,显而易见的解决方案是在每次输出后刷新缓冲区:
fflush( stdout );
cout.flush();
这会将缓冲区刷新到操作系统,一旦完成,就不会有交错或输出丢失的情况。
答案 3 :(得分:0)
缓冲头痛。通常,你可以,因为它们是同步的。告诉你不要的人可能是那些记得使用多种io方法并希望从中拯救你的痛苦的人。 (只是不要与系统调用混合。这将是痛苦的。)
答案 4 :(得分:0)
库不应该对标准句柄使用printf,cout或任何其他I / O.他们应该使用回调例程将输出委托给主程序选择的方法。
一个明显的例外是一个库,其唯一目的是输出,但是它是主程序使用它的选择。此规则不禁止I / O对库打开的文件描述符。
这不仅可以解决此处提出的问题,而且还可以解决断开连接的操作(没有tty的linux程序,例如通过nohup
或Win32服务运行)。