Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

c++ Mixing printf with wprintf (or cout with wcout)

Tags:

c++

I know you should not mix printing with printf,cout and wprintf,wcout, but have a hard time finding a good answer why and if it is possible to get round it. The problem is I use a external library that prints with printf and my own uses wcout. If I do a simple example it works fine, but from my full application it simply does not print the printf statements. If this is really a limitation, then there would be many libraries out there which can not work together with wide printing applications. Any insight on this is more than welcome.

Update :

I boiled it down to :

#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;
}

So I guess it might be a flushing problem, but it still looks strange to me, I have to check up on it.

Update -> Work around :

First of all, the same problem arise with wprintf. But I found that adding :

std::ios::sync_with_stdio(false);

actually did the trick...(note false and not as I would expect true..), the only thing that bothers me, is that I don't understand why and how to figure it out :-(

like image 595
Bo Jensen Avatar asked Apr 25 '10 14:04

Bo Jensen


1 Answers

I think you're talking about std::ios_base::sync_with_stdio, but IIRC it is on by default.

like image 73
Michael Krelin - hacker Avatar answered Oct 20 '22 14:10

Michael Krelin - hacker