c ++在printf中混合printf(或cout与scout)

时间:2010-04-25 14:10:09

标签: c++

我知道你不应该将打印与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);

实际上做了诀窍......(注意错误而不是我所期望的那样......),唯一令我烦恼的是,我不明白为什么以及如何弄明白: - (

5 个答案:

答案 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服务运行)。