crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

flankerr
  опции профиля:
сообщение 28.7.2008, 11:54
Сообщение #1


Активный участник
***

Группа: Участник
Сообщений: 356
Регистрация: 9.1.2008
Пользователь №: 65

Спасибо сказали: 2 раз(а)




Репутация:   0  


как рабоать с QDataStream ?
предположим хочу хзатолкнуть в стрим некий буфер:

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

так вот значение size бредовое (очень большое)
где грабли ?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
2 страниц V   1 2 >  
Начать новую тему
Ответов (1 - 13)
void*
  опции профиля:
сообщение 28.7.2008, 12:03
Сообщение #2


Программист-самоучка
***

Группа: Участник
Сообщений: 429
Регистрация: 4.6.2008
Пользователь №: 193

Спасибо сказали: 28 раз(а)




Репутация:   3  


а ты указал 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


Сообщение отредактировал void* - 28.7.2008, 12:03
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
flankerr
  опции профиля:
сообщение 28.7.2008, 12:10
Сообщение #3


Активный участник
***

Группа: Участник
Сообщений: 356
Регистрация: 9.1.2008
Пользователь №: 65

Спасибо сказали: 2 раз(а)




Репутация:   0  


на счёт size он у меня оказался без знаоквым :blush:
т.е. возразает -1 на самом деле.

запихивал в конструктор QByteArray не помогло....
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 28.7.2008, 12:13
Сообщение #4


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Returns the number of bytes actually written, or -1 on error
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
flankerr
  опции профиля:
сообщение 28.7.2008, 12:18
Сообщение #5


Активный участник
***

Группа: Участник
Сообщений: 356
Регистрация: 9.1.2008
Пользователь №: 65

Спасибо сказали: 2 раз(а)




Репутация:   0  


Цитата(Litkevich Yuriy @ 28.7.2008, 13:13) *
Returns the number of bytes actually written, or -1 on error

Ну то что ошибка это и так понятно
вопрос где грабли ?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 28.7.2008, 12:30
Сообщение #6


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


помоему грабли как раз в том, что написал void* - устройство неуказано.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
flankerr
  опции профиля:
сообщение 28.7.2008, 12:37
Сообщение #7


Активный участник
***

Группа: Участник
Сообщений: 356
Регистрация: 9.1.2008
Пользователь №: 65

Спасибо сказали: 2 раз(а)




Репутация:   0  


т.е. просто как буффер использовать нельзя?

т.е. мне нужен некий буффер в конец которого я записываю произвольнео число байт а когда мне надо считываю происзвольное число байт из начала буффера. Просто не хотелось заново изобретать велосипед.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
void*
  опции профиля:
сообщение 28.7.2008, 12:42
Сообщение #8


Программист-самоучка
***

Группа: Участник
Сообщений: 429
Регистрация: 4.6.2008
Пользователь №: 193

Спасибо сказали: 28 раз(а)




Репутация:   3  


для твоих целей как раз существует класс QBuffer
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 28.7.2008, 12:49
Сообщение #9


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


если покажется мало QBuffer'а
еще смотри такие: QQueue и QStack
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
flankerr
  опции профиля:
сообщение 28.7.2008, 15:51
Сообщение #10


Активный участник
***

Группа: Участник
Сообщений: 356
Регистрация: 9.1.2008
Пользователь №: 65

Спасибо сказали: 2 раз(а)




Репутация:   0  


Цитата(Litkevich Yuriy @ 28.7.2008, 13:49) *
если покажется мало QBuffer'а
еще смотри такие: QQueue и QStack


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

Сообщение отредактировал flankerr - 28.7.2008, 15:52
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
void*
  опции профиля:
сообщение 28.7.2008, 19:44
Сообщение #11


Программист-самоучка
***

Группа: Участник
Сообщений: 429
Регистрация: 4.6.2008
Пользователь №: 193

Спасибо сказали: 28 раз(а)




Репутация:   3  


так а QBuffer чем не подходит? его также можно использовать вместе с QDataStream и QTextStream
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
flankerr
  опции профиля:
сообщение 29.7.2008, 16:00
Сообщение #12


Активный участник
***

Группа: Участник
Сообщений: 356
Регистрация: 9.1.2008
Пользователь №: 65

Спасибо сказали: 2 раз(а)




Репутация:   0  


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
  опции профиля:
сообщение 29.7.2008, 17:36
Сообщение #13


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(flankerr @ 29.7.2008, 20:00) *
но в купе с QDataStream

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

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

тебе в сетаки что надо?
если буфер, то вот он QBuffer - готовый, не надо изобретать велосипед.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
flankerr
  опции профиля:
сообщение 30.7.2008, 11:33
Сообщение #14


Активный участник
***

Группа: Участник
Сообщений: 356
Регистрация: 9.1.2008
Пользователь №: 65

Спасибо сказали: 2 раз(а)




Репутация:   0  


Фактически мне нужна очередь
То что мне надо я уже реализовал сам и выложи распечтаку кода - просто и быстро.
QBuffer использует seek т.е. он читает с указанного места и НЕ удаляет после прочтения.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

2 страниц V   1 2 >
Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0


RSS Рейтинг@Mail.ru Текстовая версия Сейчас: 3.7.2025, 12:04