Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 25.02.2014, 11:10   #1
STRELOK-2007
Форумчанин
 
Регистрация: 06.08.2009
Сообщений: 144
Вопрос Разделенная запись одного набора данных в насколько TStream

Приветствую!

Допустим есть

procedure Write(var Buffer; const Size: Int64);
или
procedure Read(ver Buffer; const Size: Int64);

И есть парочка файлов
File1.bin 1024б
File2.bin 1024б
File3.bin 1024б

Которые из себя на самом деле один набор данных, просто разделенный по нескольким файлам, размером 3072б.

Планирую сделать "виртуальный" наследник TStream, обеспечивающий прозрачную запись/чтение данных.
В зависимости от текущей позиции, в этом виртуальном классе - подлючается нужный файл и работа идет с ним.

Допустим текущая позиция равна 1000, соответственно подключен File1.bin и реальная позиция в нем - тоже 1000.

Нужно записать Buffer размером 32 байта. Соответственно, 24 байта нужно записать в File1.bin, закрыть его, открыть File2.bin, перейти на 0 позицию - и записать оставшиеся 8 байт.

Как можно это осуществить?

Да, можно использовать какой то промежуточный массив байт, но это при небольших объемах хорошо.
STRELOK-2007 вне форума Ответить с цитированием
Старый 25.02.2014, 12:12   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Запихнуть последовательно все три файла в один MemoryStream, после правки выгрузить в 3 или 23 килобайтных файла. Все операции чтения-записи с использованием ReadBuffer и WriteBuffer

PS

ТС, матюки в личках это по крайней мере не порядочно
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 25.02.2014 в 12:15.
Аватар вне форума Ответить с цитированием
Старый 25.02.2014, 12:44   #3
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,527
По умолчанию

для одинаковых
Код:
numstream:=superposition div SizeStream;
streamposition:=superposition mod SizeStream;
для разных
Код:
posstream:=superPosition;
numstream:=0;
while postream>streamsize[numstream] do 
begin
   posstream:=posStream - streamsize[numstream];
   numstream:=numstream+1;
end;
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 25.02.2014 в 12:50.
evg_m вне форума Ответить с цитированием
Старый 25.02.2014, 16:41   #4
STRELOK-2007
Форумчанин
 
Регистрация: 06.08.2009
Сообщений: 144
Восклицание

Цитата:
Сообщение от Аватар Посмотреть сообщение
Запихнуть последовательно все три файла в один MemoryStream, после правки выгрузить в 3 или 23 килобайтных файла. Все операции чтения-записи с использованием ReadBuffer и WriteBuffer

PS

ТС, матюки в личках это по крайней мере не порядочно
Ты действительно думаешь, что я буду по несколько байт записывать информацию?
Что, если речь идет о нескольких гигабайтах - оперативка лопнет MemoryStream создавать.

Цитата:
Сообщение от evg_m Посмотреть сообщение
для одинаковых
Код:
numstream:=superposition div SizeStream;
streamposition:=superposition mod SizeStream;
для разных
Код:
posstream:=superPosition;
numstream:=0;
while postream>streamsize[numstream] do 
begin
   posstream:=posStream - streamsize[numstream];
   numstream:=numstream+1;
end;
Речь идет не о том как определить смещение, а о том, как записать часть буффера в один поток, а часть - в другой?

P.S.
Почему на все мои вопросы отвечают либо не то, либо какой-то флуд? Я что не правильные вопросы задаю, или карма у меня такая?
STRELOK-2007 вне форума Ответить с цитированием
Старый 25.02.2014, 16:48   #5
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

ReadBuffer и WriteBuffer разбуй глаза и посмотри что эти методы делают и где там речь об одном байте
Цитата:
Я что не правильные вопросы задаю, или карма у меня такая?
Прежде всего в help не смотришь
Цитата:
Что, если речь идет о нескольких гигабайтах - оперативка лопнет MemoryStream создавать.
В вопросе речь шла о нескольких килобайтах, вдруг откуда ни возмись они стали гигами
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 25.02.2014 в 16:50.
Аватар вне форума Ответить с цитированием
Старый 25.02.2014, 16:58   #6
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,527
По умолчанию

Цитата:
как записать часть буффера в один поток, а часть - в другой?
скажу если скажешь(покажешь код) как записать весь буфер в один.

У тебя есть переменные с которыми ты можешь делать все что хошь(прибавлять и отнимать).
Буфер это указатель(Pointrer ) на память где хранятся некоторые нужные тебе данные.
как из одного получить два (один с нулевым смещением, а другой с другим известным смещением)?
Цитата:
Речь идет не о том как определить смещение
как узнать сколько данных из указанного места мне надо писать?
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 25.02.2014 в 17:02.
evg_m вне форума Ответить с цитированием
Старый 25.02.2014, 17:19   #7
STRELOK-2007
Форумчанин
 
Регистрация: 06.08.2009
Сообщений: 144
Восклицание

А ответ был предельно просто

Код:
 TTestXXL = packed record
  c1,
  c2: Cardinal;
 end;

procedure TForm1.sButton5Click(Sender: TObject);
var
 t: TTestXXL;
 bp: NativeInt;
begin
 t.c1:=7304;
 t.c2:=314490;

 sRichEdit3.Lines.Add(IntToHex(t.c1, 8));
 sRichEdit3.Lines.Add(IntToHex(t.c2, 8));

 bp:=NativeInt(@t);

 MS1.Write(Pointer(bp+0)^, 4);
 MS2.Write(Pointer(bp+4)^, 4);
end;

procedure TForm1.sButton6Click(Sender: TObject);
var
 t: TTestXXL;
 bp: NativeInt;
begin
 t.c1:=666;
 t.c2:=777;

 bp:=NativeInt(@t);

 MS1.Position:=0;
 MS2.Position:=0;

 MS1.Read(Pointer(bp+0)^, 4);
 MS2.Read(Pointer(bp+4)^, 4);

 sRichEdit3.Lines.Add(IntToHex(t.c1, 8));
 sRichEdit3.Lines.Add(IntToHex(t.c2, 8));
end;
Код:
00001C88
0004CC7A
00001C88
0004CC7A


P.S.
Печально, что как всегда, в итоге, ответ я нахожу сам...
Только на это уходит, куда больше времени...
STRELOK-2007 вне форума Ответить с цитированием
Старый 26.02.2014, 08:58   #8
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,527
По умолчанию

Цитата:
Буфер это указатель(Pointrer ) на память где хранятся некоторые нужные тебе данные.
как из одного получить два (один с нулевым смещением, а другой с другим известным смещением)?
Радует что вы смогли воспользоваться, пусть даже и неосознанно.
Цитата:
Код:
bp:=NativeInt(@t);

 MS1.Write(Pointer(bp+0)^, 4);
 MS2.Write(Pointer(bp+4)^, 4);
Значит еще не все потеряно.

Текст был дан именно для того чтобы
Цитата:
в итоге, ответ я нахожу сам...
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 26.02.2014 в 09:00.
evg_m вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
экспорт набора данных из бд в word kate158 Общие вопросы Delphi 9 22.11.2013 15:27
Запись бинарных данных в TStream retroguy Общие вопросы Delphi 10 24.04.2012 22:03
Запись в Excel даты из набора данных VHomer БД в Delphi 1 06.03.2012 13:44
ADO Обновление набора данных Ale-X91 БД в Delphi 6 14.02.2012 14:38
Изменение набора данных BDGrid alex_fcsm БД в Delphi 3 30.01.2010 21:30