C ++ Печать отформатированных данных в std :: cout или в файл (буферизированный) - PullRequest
1 голос
/ 27 июня 2011

Я немного использовал Каркас журналирования Петру . Это часть его кода:

class Output2FILE
{
public:
  static FILE*& Stream() {
    static FILE* pStream = stderr;
    return pStream;
  }
};

Что очень хорошо, поскольку он просто регистрируется в stderr без каких-либо действий, но с функцией, которая впоследствии может быть установлена ​​на что угодно, включая stdout и файл. Тем не менее, я думаю, что этот подход не может быть использован для форматированных данных, поскольку нужно использовать fprintf.

Поэтому я пытаюсь придумать что-то похожее, что позволяет использовать stdout по умолчанию и которое можно переключить в файл, но используя оператор «<<» для форматированных данных. </p>

Может быть, что-то вроде

std::ostream myOutput(std::cout);

с идеей затем сделать myOutput << "Hello" << 1 << 1.5;. Однако вышеупомянутая строка заставляет компилятор жаловаться.

Какой правильный путь?

Спасибо!

Ответы [ 3 ]

1 голос
/ 27 июня 2011

Вы можете использовать указатель на std::ostream, очень похожий на FILE* версию.

std::ostream* os = &std::cerr;
if (log_to_file) {
  os = new std::ofstream("my.log");
}

*os << "Hello Log!" << std::endl;

if (log_to_file) { // or less 'safe' os != &std::cerr ...
    // close file here
}
1 голос
/ 27 июня 2011

Простой ответ, действительно

std::ostream& myOutput(std::cout);

Спасибо

0 голосов
/ 27 июня 2011

Я не совсем уверен, что правильно понял, что вы ищете. Но кажется, что этот мог бы помочь тебе:

#include <sstream>

#define SSTR( x ) ( dynamic_cast< std::ostringstream & >( \
            ( std::ostringstream() << std::dec << x ) ).str()

Использование:

SSTR( "Hello" << 1 << 1.5 );

Возвращает std :: string (которую затем можно передать любой функции вывода, которую вы хотите).

Подробное описание и объяснение: http://dev.rootdirectory.de/trac.fcgi/wiki/SSTR%28%29

...