Хорошей практикой является запись двоичного потока в файл или стандартный вывод - PullRequest
0 голосов
/ 11 октября 2018
#include <fstream> 
#include <vector>
#include <iostream>

int main()
{
    bool bWriteConsole = true;
    std::streambuf *buf;
    std::ofstream outfile;

    if (bWriteConsole)
        buf = std::cout.rdbuf();
    else
    {
        outfile.open("./hello.bin", std::ofstream::binary | std::ofstream::out);
        buf = outfile.rdbuf();
    }

    std::ostream outstream(buf);
    std::vector<char> m_tableBuffer;
    double dValue = 1.2345;
    const void* dBytes = &dValue;
    std::copy(static_cast<const char *>(dBytes), static_cast<const char *>(dBytes) + sizeof(double), std::back_inserter(m_tableBuffer));

    outstream.write((char*)m_tableBuffer.data(), m_tableBuffer.size());

    if (!bWriteConsole)
        outfile.close();
    else
        std::cout << std::flush;

    return 0;
}

Мне нужно добавить функцию в мое существующее приложение, чтобы оно могло выводить двоичный поток в стандартный вывод вместо файла.Прототип показан выше.

Вопрос> Есть ли проблемы с этой реализацией?Есть ли элегантное решение без учета RAII?

Спасибо

== Обновлено на основе комментариев от luk32

void function2()
{
    bool bWriteConsole = true;
    std::ofstream outfile;

    if (!bWriteConsole)
        outfile.open("./hello.bin", std::ofstream::binary | std::ofstream::out);

    std::vector<char> m_tableBuffer;
    double dValue = 1.2345;
    const void* dBytes = &dValue;
    std::copy(static_cast<const char *>(dBytes), static_cast<const char *>(dBytes) + sizeof(double), std::back_inserter(m_tableBuffer));

    if (!bWriteConsole)
    {
        outfile.write((char*)m_tableBuffer.data(), m_tableBuffer.size());
        outfile.close();
    }
    else
    {
        std::cout.write((char*)m_tableBuffer.data(), m_tableBuffer.size());
        std::cout.flush();
    }
}

1 Ответ

0 голосов
/ 11 октября 2018

Моя версия была бы чем-то более похожим на это:

#include <iostream>
#include <fstream>

void function2(bool bWriteConsole)
{
    std::ofstream outfile;

    if (!bWriteConsole)
        outfile.open("./hello.bin", std::ofstream::binary | std::ofstream::out);

    double dValue = 1.2345;

    // writing out
    std::ostream& out = bWriteConsole ? std::cout : outfile;
    out.write(reinterpret_cast<char*>(&dValue), sizeof dValue);
    out.flush();
}

Написание кода - 2 строки, 3, если вы действительно хотите сбросить.outfile.close() также будет сбрасывать, так что безусловное сбрасывание не повредит вашему подходу.Файл закроется, когда outfile выйдет из области видимости, поэтому его не нужно записывать, если вы действительно не хотите вручную закрывать файл перед дальнейшей обработкой.Здесь это излишне (RAII совершенство вступает в игру здесь).

Aa и возможно рефакторинг написание:

template<typename T>
void dump(T val, std::ostream& out ) {
    out.write(reinterpret_cast<char*>(&val), sizeof val);
    out.flush();
}

void function2(bool bWriteConsole)
{
    std::ofstream outfile;

    if (!bWriteConsole)
        outfile.open("./hello.bin", std::ofstream::binary | std::ofstream::out);

    double dValue = 1.2345;
    dump(dValue, bWriteConsole ? std::cout : outfile);
    // writing out
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...