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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 06.04.2018, 14:49   #1
v258
Пользователь
 
Регистрация: 29.10.2008
Сообщений: 25
Вопрос WriteBuffer искажает данные

Имеется следующий код:

Код:
procedure TForm7.Button1Click(Sender: TObject);
var
  Mem: TMemoryStream;
begin
  Mem := TMemoryStream.Create;
  try
    Memo1.Lines.SaveToStream(mem);
    Mem.SaveToFile('d:\12');
    WriteBuf(Mem, Mem.Size);
  finally
    Mem.Free;
  end;
end;

procedure WriteBuf(var buf; bufSize: Integer);
var
  mem: TMemoryStream;
begin
  mem := TMemoryStream.Create;
  try
    mem.WriteBuffer(Buf, BufSize);
    mem.SaveToFile('d:\13');
  finally
    mem.Free;
  end;
end;
Проблема в том, что в файле 12 записаны корректные данные, а в 13 - какой-то мусор, хотя размеры файлов совпадают. Почему WriteBuffer пишет в mem какую-то фигню?

UPD: Delphi 2010

Последний раз редактировалось v258; 06.04.2018 в 14:53.
v258 вне форума Ответить с цитированием
Старый 06.04.2018, 15:03   #2
Filka
Форумчанин
 
Регистрация: 29.10.2015
Сообщений: 273
По умолчанию

Код:
WriteBuf(Mem.Memory^, Mem.Size);
Filka вне форума Ответить с цитированием
Старый 06.04.2018, 16:05   #3
v258
Пользователь
 
Регистрация: 29.10.2008
Сообщений: 25
По умолчанию

Спасибо, добрый человек, так работает. Но есть еще обратный вопрос - мало данные сохранить, их еще нужно считать. Вот, собственно, код:

Код:
procedure TForm7.Button2Click(Sender: TObject);
var
  Mem: TMemoryStream;
begin
  Mem := TMemoryStream.Create;
  try
    ReadBuf(Mem);
    Mem.SaveToFile('d:\14');
  finally
    Mem.Free;
  end;
end;

procedure ReadBuf(var buf);
var
  mem: TMemoryStream;
begin
  mem := TMemoryStream.Create;
  try
    mem.LoadFromFile('d:\13');
    mem.Position := 0;
    mem.ReadBuffer(Buf, mem.Size);
  finally
    mem.Free;
  end;
end;
На строке Mem.SaveToFile('d:\14'); вылетает AV, файл записывается пустым. Если вызвать ReadBuf с указателем:
Код:
ReadBuf(Mem.Memory^);
то AV вылетает на строке mem.ReadBuffer(Buf, mem.Size); Сильно подозреваю, что проблема имеет место быть из-за того, что размер буфера не задан. Вопрос глупый, но как его задать?
v258 вне форума Ответить с цитированием
Старый 06.04.2018, 17:53   #4
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,629
По умолчанию

не размер не задан, а память не выделена.
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума Ответить с цитированием
Старый 06.04.2018, 18:06   #5
v258
Пользователь
 
Регистрация: 29.10.2008
Сообщений: 25
По умолчанию

Это да, но заранее узнать размер не получится - в оригинале данные будут читаться не из файла
v258 вне форума Ответить с цитированием
Старый 06.04.2018, 18:52   #6
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,629
По умолчанию

Цитата:
Сообщение от v258 Посмотреть сообщение
Это да, но заранее узнать размер не получится - в оригинале данные будут читаться не из файла
А Stream.Size, блть, для чего?!
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума Ответить с цитированием
Старый 06.04.2018, 19:00   #7
v258
Пользователь
 
Регистрация: 29.10.2008
Сообщений: 25
По умолчанию

Цитата:
Сообщение от min@y™ Посмотреть сообщение
А Stream.Size, блть, для чего?!
Вопрос был не об этом. Я могу выделить нужное количество памяти для буфера перед вызовом ReadBuff, и, если я так сделаю так
Код:
Mem.SetSize(18); // грубо говоря
ReadBuf(Mem);
, то никаких AV не вываливается. Беда в том, что в реале в этот момент мне еще не известно, сколько конкретно нужно будет выделить. В самой ReadBuff я, естественно, могу получить размер mem.Size, но вот каким образом выделить эту память для Buf, честно говоря, я что-то не соображу
v258 вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
WriteBuffer в IdTCPClient в Builder XE4 Beliy Pasha Общие вопросы C/C++ 0 02.10.2015 01:38
задача: есть БД с 2 файлами в которые записываются данные о квартирах, выбрать нужные данные lexa_7up Помощь студентам 4 11.01.2014 19:37
WriteBuffer ??? IgoRek125 Компоненты Delphi 8 28.04.2012 16:39
Как упорядочить данные (перевести данные из стольбцов в строки)? opeck Microsoft Office Excel 3 21.11.2011 01:43
Write или WriteBuffer? Pedro Свободное общение 4 03.02.2010 02:03