преобразовать std :: ostream в какой-нибудь массив? - PullRequest
2 голосов
/ 27 июня 2011

У меня есть устаревшая библиотека, которая берет данные с оборудования и записывает их в ostream. Метод выглядит следующим образом:

int sensors(ostream*) const;

Я недостаточно опытен в древних путях. Как преобразовать эти данные в QByteArray? Или, по крайней мере, до char массива известного размера? Я бы решил это сам, но есть еще одна проблема: данные в ostream кажутся произвольной длины и имеют несколько произвольных символов '\0', поэтому вы не можете рассчитывать на то, что они заканчиваются нулем.

Ответы [ 3 ]

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

Я не пробовал, но вам нужно что-то вроде этого:

ostream s (ios::out | ios::binary);
//..Populate the stream

//Convert it to string. string can hold \0 values too.
string str = s.str ();

QByteArray ba (str.data (),str.size ());
1 голос
/ 27 июня 2011

Я думаю, что это то, что OrcunC достиг:

std::stringstream s;
sensors( &s );
QByteArray( s.str().data(), (int) s.str().size() );

... но, надеюсь, более понятно :).Смотрите также std :: stringstream и std :: string для получения информации о классах / функциях-членах, используемых здесь.Кстати, обратите внимание, что я использую str (). Data (), а не str (). C_str () - я очень осторожно обращаюсь с этими \0 символами и не предполагаю завершения NULL.

0 голосов
/ 22 января 2018

Вы можете создать подкласс std :: ostream и использовать объект подкласса для сбора байтов в ваш QByteArray.

/**
 * This helper class collects bytes that are passed to it
 * into a QByteArray.
 *
 * After https://stackoverflow.com/a/19933011/316578
 */
class QByteArrayAppender : public std::ostream, public std::streambuf {
private:
    QByteArray &m_byteArray;
public:
    QByteArrayAppender(QByteArray &byteArray)
        : std::ostream(this),
          std::streambuf(),
          m_byteArray(byteArray) {
    }

    int overflow(int c) {
        m_byteArray.append(static_cast<char>(c));
        return 0;
    }
};

Это позволяет избежать использования std :: string, которая является дополнительной копиейбайтовый массив.

...