2010-04-25 13 views
10

Sé que no debe mezclar impresión con printf, cout y wprintf, wcout, pero tiene dificultades para encontrar una buena respuesta por qué y si es posible esquivarla. El problema es que utilizo una biblioteca externa que imprime con printf y mis propios usos wcout. Si hago un ejemplo simple, funciona bien, pero desde mi aplicación completa simplemente no imprime las instrucciones printf. Si esto es realmente una limitación, entonces habría muchas bibliotecas que no pueden funcionar junto con aplicaciones de impresión anchas. Cualquier idea sobre esto es más que bienvenida.C++ Mezclando printf con wprintf (o cout con wcout)

Actualización:

Me hierve abajo a:

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

así que supongo que podría ser un problema de rubor, pero todavía se ve extraño para mí, tengo que comprobar para arriba en él.

Actualización -> Trabajo en torno a:

En primer lugar, el mismo problema se plantea con wprintf. Pero he encontrado que la adición:

std::ios::sync_with_stdio(false); 

realmente hizo el truco ... (nota falsa, y no lo que cabe esperar cierto ..), la única cosa que me molesta, es que no entiendo por qué y cómo averiguarlo :-(

+0

Herví hacia abajo a lo siguiente: #include #include #include \t #include #include int principal () { char * buf; std :: wcout << std :: endl;/* AGREGAR ESTA LÍNEA HACE PRINTF VANISH !!! */ rl_bind_key ('\ t', rl_abort); // desactivar la función de autocompletar mientras ((buf = readline ("mi-comando:"!)) = NULL) { si (strcmp (buf, "salir") == 0) ruptura; std :: wcout << buf << std :: endl; if (buf [0]! = 0) add_history (buf); } gratis (buf); return 0; } –

+0

lo siento, obviamente, mi error no se debe utilizar con fragmentos de código. –

+1

Por qué las respuestas se centran en mezclar 'cout' y' printf', mientras que la pregunta es acerca de mezclar 'cout' y' wcout' ... – kennytm

Respuesta

6

Usted debe ser capaz de mezclar ellos, pero por lo general utilizar mecanismos de amortiguación separadas por lo que se superponen entre sí:

printf("hello world"); 
cout << "this is a suprise"; 

puede resultar en:

hellothis es un mundo sorpresa

Usted no proporciona suficiente información para diagnosticar su problema con printf() en su aplicación, pero sospecha que tiene más de un tiempo de ejecución de C (una en su código, uno de cada el código printf()) y hay un conflicto.

+0

Lo que hago es usar la biblioteca GNU readline para el historial de línea de comandos. Entonces mi aplicación está vinculada a esta biblioteca. –

+1

Podría agregar, que si hablamos de mezclar cout y wcout (y no printf y wcout), entonces es mi experiencia que no se trata solo de un problema, la aplicación puede fallar. Gracias por tu respuesta. –

+0

@Bo Jensen: Eso no es culpa de nadie. Es tu culpa. O eso o hay un error en su implementación de la biblioteca estándar de C++. –

5

Creo que estás hablando de std::ios_base::sync_with_stdio, pero IIRC está activado por defecto.

2

Los buffers printf() y cout están sincronizados por defecto, o de hecho son el mismo buffer. Si está teniendo problemas con el almacenamiento en búfer, la solución obvia es la de vaciar el búfer después de cada salida:

fflush(stdout); 
cout.flush(); 

esta vacía el búfer (s) para el sistema operativo, y una vez hecho no hay ninguna posibilidad de intercalación, o de salida que se pierde.

0

dolores de cabeza de buffering. normalmente, puede, ya que están sincronizados. las personas que le dicen que no lo haga son probablemente personas que recuerdan el dolor de usar múltiples métodos io y quieren salvarlo de él. (simplemente no mezcle con las llamadas al sistema. Eso sería doloroso.)

0

Las bibliotecas no deben usar printf, cout o cualquier otra E/S en los identificadores estándar. Deben usar una rutina de devolución de llamada para delegar el resultado a un método de la elección del programa principal.

Una excepción obvia es una biblioteca cuyo único propósito es la salida, pero luego es la elección del programa principal para usar eso.Y esta regla no prohíbe E/S a los descriptores de archivos abiertos por la biblioteca.

Esto no solo resuelve el problema planteado aquí, sino que también se encarga de la operación desconectada (programa de Linux sin tty, por ejemplo, ejecute a través de nohup o servicio de Win32).