Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: QDataStream
Форум на CrossPlatform.RU > Библиотеки > Qt > Qt Ввод/Вывод, Сеть. Межпроцессное взаимодействие
flankerr
как рабоать с QDataStream ?
предположим хочу хзатолкнуть в стрим некий буфер:

QDataStream stream;
char tmp[256];
int size = stream.writeRawData(tmp,255);

так вот значение size бредовое (очень большое)
где грабли ?
void*
а ты указал QIODevice, в который будут записываться данные?
вот пример из ассистента:
QFile file("file.dat");
file.open(QIODevice::WriteOnly);
QDataStream out(&file);   // we will serialize the data into the file
out << "the answer is";   // serialize a string
out << (qint32)42;        // serialize an integer
flankerr
на счёт size он у меня оказался без знаоквым :blush:
т.е. возразает -1 на самом деле.

запихивал в конструктор QByteArray не помогло....
Litkevich Yuriy
Returns the number of bytes actually written, or -1 on error
flankerr
Цитата(Litkevich Yuriy @ 28.7.2008, 13:13) *
Returns the number of bytes actually written, or -1 on error

Ну то что ошибка это и так понятно
вопрос где грабли ?
Litkevich Yuriy
помоему грабли как раз в том, что написал void* - устройство неуказано.
flankerr
т.е. просто как буффер использовать нельзя?

т.е. мне нужен некий буффер в конец которого я записываю произвольнео число байт а когда мне надо считываю происзвольное число байт из начала буффера. Просто не хотелось заново изобретать велосипед.
void*
для твоих целей как раз существует класс QBuffer
Litkevich Yuriy
если покажется мало QBuffer'а
еще смотри такие: QQueue и QStack
flankerr
Цитата(Litkevich Yuriy @ 28.7.2008, 13:49) *
если покажется мало QBuffer'а
еще смотри такие: QQueue и QStack


1.Тогда уж лучше использовать STL-ные очереди
2.Очередь хороша для ФИКСИРОВАННОГО размера читаемых\записываемых данных. А мне надо ПРОИЗВОЛЬНЫЕ. Т.е. в моём случае надо делать обвязку с циклами. ПРи таком раскладе лучше уж "изобрести велосипед" с простым char* и memcpy будет гораздо эффективнее.
void*
так а QBuffer чем не подходит? его также можно использовать вместе с QDataStream и QTextStream
flankerr
QBuffer штука возможно хорошая но в купе с QDataStream для обозначенных целей получается стрельба из пушки даже не по воробьям а по комарам :)

Вот классик который делает то что мне надо быстро и просто:

class CBuffer
{
private:
    char*        m_pBuffer;
    unsigned int        m_iBufferSize;

public:
                        CBuffer()
                        {
                            m_pBuffer = NULL;
                            m_iBufferSize = 0;
                        }
                        CBuffer(const CBuffer &buf)
                        {
                            Delete();
                            m_iBufferSize = buf.Size();
                            m_pBuffer = new char[m_iBufferSize];
                        }
                        ~CBuffer()
                        {
                            Delete();
                        }
    void                Add(char*,unsigned int size);
    bool                Get(char*,unsigned int size);
    void                Delete();
    const unsigned int    Size() const;
};


inline void CBuffer::Delete()
{
    if(m_pBuffer)
    {
        delete m_pBuffer;
        m_pBuffer = NULL;
        m_iBufferSize = 0;
    }
}

inline const unsigned int CBuffer::Size() const
{
    return m_iBufferSize;
}

inline void CBuffer::Add(char* pBuf,unsigned int size)
{
    if(size)
    {
        char* pTmp = new char[m_iBufferSize + size];
        if(m_iBufferSize && m_pBuffer)
        {
            memcpy(pTmp,m_pBuffer,m_iBufferSize);
            delete m_pBuffer;
        };
        memcpy(pTmp + m_iBufferSize,pBuf,size);
        m_pBuffer = pTmp;
        m_iBufferSize += size;
    };
}

inline bool CBuffer::Get(char* pBuf,unsigned int size)
{
    bool res = false;
    if(m_pBuffer && size)
    {
        if( m_iBufferSize < size)
        {
            size = m_iBufferSize;
        };

        res = true;
        memcpy(pBuf,m_pBuffer,size);

        m_iBufferSize -= size;
        char* pTmp = NULL;

        if(m_iBufferSize)
        {
            pTmp = new char[m_iBufferSize];
            memcpy(pTmp,m_pBuffer+size,m_iBufferSize);
        }
        delete m_pBuffer;
        m_pBuffer = pTmp;
    };
    return res;
}
Litkevich Yuriy
Цитата(flankerr @ 29.7.2008, 20:00) *
но в купе с QDataStream

Цитата(flankerr @ 28.7.2008, 16:37) *
т.е. мне нужен некий буффер в конец которого я записываю произвольнео число байт

а при чем тут QDataStream?

тебе в сетаки что надо?
если буфер, то вот он QBuffer - готовый, не надо изобретать велосипед.
flankerr
Фактически мне нужна очередь
То что мне надо я уже реализовал сам и выложи распечтаку кода - просто и быстро.
QBuffer использует seek т.е. он читает с указанного места и НЕ удаляет после прочтения.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2020 IPS, Inc.