Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> MemoryStream 
V
    Опции темы
RapMan
Дата 13.7.2009, 21:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 128
Регистрация: 13.6.2008

Репутация: нет
Всего: нет



Доброе время суток!
Есть ли MemoryStream в MS Visual Studio C++ 9.0 ? Если да - как использовать (нужно консоль написать)

Заранее спасибо!
--------------------
здесь хреновые модераторы...
PM MAIL   Вверх
Alexeis
Дата 13.7.2009, 22:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 4
Всего: 459



  MemoryStream это из VCL. Можно сделать вектор байтов. push_back аналог write, pop_back извлечение из конца квадратные скобки произвольный доступ, копирование кусков через итераторы делается не менее изящно.



--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
RapMan
Дата 13.7.2009, 22:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 128
Регистрация: 13.6.2008

Репутация: нет
Всего: нет



других вариантов что нету?
--------------------
здесь хреновые модераторы...
PM MAIL   Вверх
Alexeis
Дата 13.7.2009, 23:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 4
Всего: 459



Цитата(RapMan @  13.7.2009,  21:53 Найти цитируемый пост)
других вариантов что нету? 

  Есть еще мой самописный вариант, сам искал замену, написал подобие.

заголовок 
Код

// MemStream.h: interface for the CMemStream class.
//
//////////////////////////////////////////////////////////////////////

#if !defined(AFX_MEMSTREAM_H__14210998_A071_4669_96C7_55388A483FDA__INCLUDED_)
#define AFX_MEMSTREAM_H__14210998_A071_4669_96C7_55388A483FDA__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000

#include <vector>

enum ePos
{
  FromBegin, FromEnd, FromCurrent
};

class CMemStream  
{
public:
    DWORD Write(const void *data, DWORD data_size);
    DWORD Read(void *data, DWORD data_size);
    void* Pointer();
    void  SetPosition(int pos, ePos from = FromBegin);
    DWORD GetPosition();
    inline DWORD Size(){return buffer.size();};
    void  CopyFrom(CMemStream* mem, DWORD data_size = 0);
    void  FreeSpace();
    void  SetSize(DWORD size);

    CMemStream();
    virtual ~CMemStream();


protected:
    std::vector<byte> buffer;
    DWORD Position;

    inline void Reserve(int NeedSize)
    {
        if (NeedSize < 100)
            buffer.reserve(NeedSize << 1);
        else
            buffer.reserve(NeedSize + (NeedSize >> 1));
    };
};

#endif // !defined(AFX_MEMSTREAM_H__14210998_A071_4669_96C7_55388A483FDA__INCLUDED_)



ЦППшник

Код

// MemStream.cpp: implementation of the CMemStream class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "MemStream.h"

#define min(a,b) (((a) < (b)) ? (a) : (b))

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
//Класс для работы с потоком данных в памяи (запись чтение)
CMemStream::CMemStream()
{
    Position = 0;
    buffer.reserve(16);
}

CMemStream::~CMemStream()
{

}

DWORD  CMemStream::Write(const void *data, DWORD data_size)
{
   if ((DWORD)data > 65536)
   {
       DWORD NeedSize = Position + data_size + 1;
       if (NeedSize >= buffer.size())
            buffer.resize(NeedSize);

       memcpy(&(buffer[Position]), data, data_size);
       
       Position += data_size;
       return data_size;
   }
   else 
       return 0;
}

DWORD CMemStream::Read(void *data, DWORD data_size)
{
   if ((DWORD)data > 65536)
   {
       DWORD len;
       DWORD NeedSize = Position + data_size + 1;

       if (NeedSize > buffer.size())
       {
            len = buffer.size() - Position - 1;
       }
       else len = data_size;

       memcpy(data, &(buffer[Position]), len);

       Position += len;
       return len;
   }
   else 
       return 0;
}

void* CMemStream::Pointer()
{
    return &buffer[0];
}

void  CMemStream::SetPosition(int pos, ePos from)
{
    if      (from == FromBegin)
    {
        if      (pos < 0)                   Position = 0;
        else if (pos >= (int)buffer.size()) Position = buffer.size() - 1;
        else                                Position = pos;
    }
    else if (from == FromEnd)
    {
        if      (pos < 0)                   Position = buffer.size() - 1;
        else if (pos >= (int)buffer.size()) Position = 0;
        else                                Position = buffer.size() - 1 - pos;    
    }
    else if (from == FromCurrent)
    {
        if      (pos + Position < 0)                   Position = 0;
        else if (pos + Position >= (int)buffer.size()) Position = buffer.size() - 1;
        else                                           Position = Position + pos;    
    }
    else Position = Position;
}

DWORD CMemStream::GetPosition()
{
    return Position;
}
/*
DWORD CMemStream::Size()
{
    return buffer.size();
}*/

void  CMemStream::CopyFrom(CMemStream* mem, DWORD data_size)
{
    byte tbuf[50000];
    DWORD ToCopy = 0;

    if (data_size = 0)
    {
        ToCopy = mem->Size() - mem->GetPosition();
    }
    else 
        ToCopy = min(data_size, mem->Size() - mem->GetPosition());

    if (Position + ToCopy + 1 > mem->Size())
        SetSize(Position + ToCopy + 1);    


    DWORD Copied = 0;
    do 
    {
        Copied = mem->Read(tbuf, min(ToCopy, 50000));
        Write(tbuf, Copied);
        ToCopy -= Copied;
    }while (ToCopy > 0);    
}

void  CMemStream::FreeSpace()
{
    buffer.clear();
    buffer.swap(std::vector<byte>(buffer));
    Position = 0;
}

void  CMemStream::SetSize(DWORD size)
{
    Reserve(size);
    buffer.resize(size);
}



--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
azesmcar
Дата 13.7.2009, 23:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 52
Всего: 211



Цитата(Alexeis @  13.7.2009,  22:42 Найти цитируемый пост)
MemoryStream это из VCL

Он есть и в .NET
http://msdn.microsoft.com/en-us/library/sy...morystream.aspx

Можно использовать, если писать CLR
PM   Вверх
RapMan
Дата 13.7.2009, 23:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 128
Регистрация: 13.6.2008

Репутация: нет
Всего: нет



Alexeis, 
Большое Спасибо! smile 

azesmcar,
Ради одного memorystream - CLR и тем более .NET не хочу использовать  smile  
--------------------
здесь хреновые модераторы...
PM MAIL   Вверх
maxim1000
Дата 13.7.2009, 23:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

Репутация: 1
Всего: 110



в зависимости от задачи может подойти std::ostringstream/istringstream


--------------------
qqq
PM WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0535 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.