потоки (stream) в памяти
От: Золотых О.А.  
Дата: 27.08.01 09:50
Оценка:
Привет, All!

Недавно совсем начал знакомиться с VC++6. До этого программировал на C++Builder 5.
В связи с чем и вопрос. Пользовался я VCL классом TMemoryStream. Он достался в наследство от Delphi.

В нем я мог сохранить данные так:

int i;
double d;
// сохраняем
MemStream.Position = 0;
MemStream.Write( &i, sizeof( i ) );
MemStream.Write( &d, sizeof( d ) );
...
// восстанавливаем
MemStream.Position = 0;
MemStream.Read( &i, sizeof( i ) );
MemStream.Read( &d, sizeof( d ) );

А каким классом для такой цели мне лучше всего воспользоваться в VC++
Должен же быть стандартный поток в памяти, но что я нашел, так это strstream.
Но кажется это для бинарных данных не совсем то, или я не прав?


Желательно очень продублировать ответ на email: oleg_zl@yahoo.com

Спасибо.

Олег.
Re: потоки (stream) в памяти
От: Gambler  
Дата: 27.08.01 09:55
Оценка:
Здравствуйте Золотых О.А., вы писали:

ЗО> Привет, All!



ЗО> А каким классом для такой цели мне лучше всего воспользоваться в VC++

ЗО> Должен же быть стандартный поток в памяти, но что я нашел, так это strstream.
ЗО> Но кажется это для бинарных данных не совсем то, или я не прав?


Насколько мне известно нет такого класса в стандартных либах VC++,
сделай сам там работы на пол часа.

удачи.
-------------------------------------------------------------------

Вызывает презедент к себе коров и говорит:
— Ну, что будем сдавать, молоко или мясо?
(с) Г. Явлинский TV6 — Герой дня (18.04.2002)
Re[2]: потоки (stream) в памяти
От: sergeiv  
Дата: 12.07.04 13:39
Оценка:
Здравствуйте, Gambler, Вы писали:


G>Насколько мне известно нет такого класса в стандартных либах VC++,

G>сделай сам там работы на пол часа.

strstream нормально работает с двоичными данными, вот пример:

#include <strstream>


int main(int argc, char* argv[])
{
std::strstream s;
char buf[] = {0,1,2,3,4,5,'\r','\n'};
s.write(buf, sizeof(buf));
int k = s.pcount();
char* pbuf = new char[k];
memcpy(pbuf, s.str(), k);
return 0;
}


в pbuf будет 00 01 02 03 04 05 0D 0A
Re: потоки (stream) в памяти
От: folk Россия  
Дата: 12.07.04 23:38
Оценка:
Здравствуйте, Золотых О.А., Вы писали:

ЗОА> Недавно совсем начал знакомиться с VC++6. До этого программировал на C++Builder 5.

ЗОА> В связи с чем и вопрос. Пользовался я VCL классом TMemoryStream. Он достался в наследство от Delphi.

ЗОА> В нем я мог сохранить данные так:


ЗОА> int i;

ЗОА> double d;
ЗОА> // сохраняем
ЗОА> MemStream.Position = 0;
ЗОА> MemStream.Write( &i, sizeof( i ) );
ЗОА> MemStream.Write( &d, sizeof( d ) );
ЗОА> ...
ЗОА> // восстанавливаем
ЗОА> MemStream.Position = 0;
ЗОА> MemStream.Read( &i, sizeof( i ) );
ЗОА> MemStream.Read( &d, sizeof( d ) );

ЗОА> А каким классом для такой цели мне лучше всего воспользоваться в VC++

ЗОА> Должен же быть стандартный поток в памяти, но что я нашел, так это strstream.
ЗОА> Но кажется это для бинарных данных не совсем то, или я не прав?

Если нужно просто складывать бинарные блоки в конец потока и доставать их из начала потока, то можно использовать deque<unsigned char>, так будет быстрее всего. Возьми за основу это:
#include<deque>
#include<algorithm>

typedef unsigned char byte;

class MemStream
{
public:
 void PushBack(void const* p, size_t size)
 {
  Byte const* pb = static_cast<byte const*>(p);
  deq_.insert( deq_.end(), pb, pb + size );
 }

 void PopFront(void* p, size_t size)
 {
  std::deque<byte>::iterator b = deq_.begin();
  std::copy( b, b + size, static_cast<byte*>(p) );
  deq_.erase( b, b + size );
 }
    
private:
 std::deque<byte> deq_;
};
На самом деле, люди не читают газеты, они принимают их каждое утро, так же как ванну. ©Маршалл Мак-Льюэн
Re: потоки (stream) в памяти
От: hard.disk  
Дата: 13.07.04 04:43
Оценка:
Здравствуйте, Золотых О.А., Вы писали:


ЗОА> А каким классом для такой цели мне лучше всего воспользоваться в VC++

ЗОА> Должен же быть стандартный поток в памяти, но что я нашел, так это strstream.
ЗОА> Но кажется это для бинарных данных не совсем то, или я не прав?

используй CMemFile (MFC)

Hard.Disk
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.