c ++ Смешивание printf с wprintf (или cout с wcout) - PullRequest
10 голосов
/ 25 апреля 2010

Я знаю, что вам не следует смешивать печать с 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;
}

Так что я думаю, что это может быть проблема с промывкой, но она все еще выглядит странно для меня, я должен проверить это.

Обновление -> Обойти:

Прежде всего, та же проблема возникает с wprintf. Но я обнаружил, что добавление:

std::ios::sync_with_stdio(false);

на самом деле сделал трюк ... (заметьте ложь, а не то, что я ожидал бы правдой ...), единственное, что меня беспокоит, это то, что я не понимаю, почему и как это выяснить: - (

Ответы [ 5 ]

6 голосов
/ 25 апреля 2010

Вы должны иметь возможность смешивать их, но они обычно используют отдельные механизмы буферизации, поэтому они перекрывают друг друга:

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

может привести к:

hellothis - это удивительный мир

Вы не предоставили достаточно информации для диагностики вашей проблемы с printf () в вашем приложении, но я подозреваю, что у вас более одной среды выполнения c (одна в вашем коде, одна в коде printf ()) и конфликт.

5 голосов
/ 25 апреля 2010

Я думаю, вы говорите о std::ios_base::sync_with_stdio, но IIRC по умолчанию включен.

2 голосов
/ 25 апреля 2010

Буферы printf () и cout либо синхронизируются по умолчанию, либо фактически являются одним и тем же буфером. Если у вас возникают проблемы с буферизацией, очевидным решением является очистка буфера после каждого вывода:

fflush( stdout );
cout.flush();

это сбрасывает буфер (ы) в операционную систему, и после этого нет возможности чередования или потери вывода.

0 голосов
/ 25 апреля 2010

Библиотеки не должны использовать printf, cout или любые другие операции ввода-вывода для стандартных дескрипторов. Им следует использовать процедуру обратного вызова для делегирования вывода методу, выбранному основной программой.

Очевидным исключением является библиотека, единственной целью которой является вывод, но тогда выбор программы будет основным. И это правило не запрещает ввод-вывод файловых дескрипторов, открытых библиотекой.

Это не только решит проблему, поднятую здесь, но также позаботится о отключенной операции (программа linux без tty, например, запущенная через nohup или служба Win32).

0 голосов
/ 25 апреля 2010

буферных головных болей. как правило, вы можете , так как они синхронизируются. люди, которые говорят вам не делать это, вероятно, люди, которые помнят боль от использования нескольких методов ввода-вывода и хотят спасти вас от этого. (только не смешивайтесь с системными вызовами. это было бы больно.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...