Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 21.11.2013, 15:47
kti kti вне форума
Прохожий
 
Регистрация: 21.11.2013
Сообщения: 10
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию Сохранение record в файл

Подскажите, уважаемые, никак не получается, в делфи новичек...
В общем переделываю чужую программу.. там идет сохранение буфера в файл, вот такой кусок
Код:
var bufferTemplate1 : PChar;
    template1Length, pTransfered : integer;
    FS: TFileStream;
    pTemplate : pointer;
begin
     //Сохраняю шаблон в bufferTemplate1
      template1Length := Bsdk_Template_GetSize(pTemplate);
      GetMem(bufferTemplate1, template1Length);
      result := Bsdk_Template_Save(pTemplate, bufferTemplate1, template1Length, pTransfered);
      // после этой функции, в bufferTemplate1 содержаться данные

      //Сохраняю буфер bufferTemplate1 в файл Param1 + '.dat'
      FS := TFileStream.Create(Param1 + '.dat', fmCreate);
      FS.WriteBuffer(bufferTemplate1^, template1Length);
      FS.Free;
      FreeMem(bufferTemplate1);

данные из bufferTemplate1 записываются в файл. Мне надо чтобы к этим данным еще записывалась кое-какая информация, ну например имя "Вася", "Петя", и соответственно потом это дело загрузить в память обратно.
Делал через record, не получается:

Код:
 TTemplate = record
     Name: string[5];
     Template: PChar; // тут пробовал разные варианты, не помогает
   end;
var 
    tTempl : TTemplate;
    FS: TFileStream;
    pTemplate : pointer;
begin
     //Сохраняю шаблон в bufferTemplate1
      template1Length := Bsdk_Template_GetSize(pTemplate);
//   SetLength(tTempl.Template, '2696');
      GetMem(tTempl.Template, template1Length);
      result := Bsdk_Template_Save(pTemplate, tTempl.Template, template1Length, pTransfered);
      tTempl.name:= 'Вася';

      FS := TFileStream.Create('c:\temp\test.dat', fmCreate);
      FS.WriteBuffer(tTempl, SizeOf(TTemplate));
      FS.Free;
      FreeMem(tTempl.Template);
// записывается только 8-10 байт, хотя должно быть не менее 2696 байт
Ответить с цитированием
  #2  
Старый 21.11.2013, 16:21
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Примерно так:
Код:
var
.....
  len: Integer;
  s: AnsiString;
begin
.....

  // Сохраняем
  FS := TFileStream.Create(Param1 + '.dat', fmCreate);
  FS.WriteBuffer(template1Length, SizeOf(template1Length)); // Сначала записываем размер даных
  FS.WriteBuffer(bufferTemplate1^, template1Length); // А потом сами данные

  s := 'Вася';
  len := Length(s);
  FS.WriteBuffer(len, SizeOf(len)); // Сначала записываем длину строки
  FS.WriteBuffer(Pointer(s)^, len); // А потом саму строку
  FS.Free;
.....

  // Считываем
  FS := TFileStream.Create(Param1 + '.dat', fmOpenRead);
  FS.ReadBuffer(template1Length, SizeOf(template1Length)); // Сначала считываем размер даных
  GetMem(bufferTemplate1, template1Length); // Резервируем память под буфер требуемого размера
  FS.ReadBuffer(bufferTemplate1^, template1Length); // А потом считываем сами данные

  FS.ReadBuffer(len, SizeOf(len)); // Сначала считываем длину строки
  SetLength(s, len); // Резервируем память под строку требуемого размера
  FS.ReadBuffer(Pointer(s)^, len); // А потом считываем саму строку
  FS.Free;
Ответить с цитированием
Этот пользователь сказал Спасибо poli-smen за это полезное сообщение:
kti (21.11.2013)
  #3  
Старый 21.11.2013, 17:56
kti kti вне форума
Прохожий
 
Регистрация: 21.11.2013
Сообщения: 10
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Заработало! Спасибо огромное! т.е. по такому-же принципу я могу любые данные сохранить.. ясно
У меня еще пару вопросов если можно
1) Для загрузки данных в программе используется конструкция через TMemoryStream:

Код:
    TS:= TMemoryStream.Create;
    TS.LoadFromFile(Param1);

    templateLength:=TS.Size;
    GetMem(BufferTemplate, templateLength);
    TS.Position:=0;
    TS.ReadBuffer(BufferTemplate^, templateLength);

Чем этот подход принципиально может отличаться от Вашего (от TFileStream), почему был выбран именно TMemoryStream?

2) Мне нужно в этот-же файл дописывать данные. т.е например уже есть "Иванов", "Петров", мне нужно дописать в этот-же файл данные "Сидоров". Будет-ли работать такой вариант:

Код:
// файл уже существует, с 2 записями, мне надо добавить 3 запись
    FS := TFileStream.Create('c:\temp\test.dat', fmOpenRead);
// как-то надо спозиционировать FS на конец файла ??
    FS.WriteBuffer(template1Length, SizeOf(template1Length)); // Сначала записываем размер данных
    FS.WriteBuffer(bufferTemplate1^, template1Length); // А потом сами данные
Ответить с цитированием
  #4  
Старый 21.11.2013, 18:06
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от kti
Заработало! Спасибо огромное! т.е. по такому-же принципу я могу любые данные сохранить.. ясно
У меня еще пару вопросов если можно
1) Для загрузки данных в программе используется конструкция через TMemoryStream:
.....
Чем этот подход принципиально может отличаться от Вашего (от TFileStream), почему был выбран именно TMemoryStream?
TMemoryStream - работает в памяти. TFileStream - работает с файлом.
Почему в той программе сделано через TMemoryStream я не знаю.

Цитата:
Сообщение от kti
2) Мне нужно в этот-же файл дописывать данные. т.е например уже есть "Иванов", "Петров", мне нужно дописать в этот-же файл данные "Сидоров". Будет-ли работать такой вариант:

Код:
// файл уже существует, с 2 записями, мне надо добавить 3 запись
    FS := TFileStream.Create('c:\temp\test.dat', fmOpenRead);
// как-то надо спозиционировать FS на конец файла ??
    FS.WriteBuffer(template1Length, SizeOf(template1Length)); // Сначала записываем размер данных
    FS.WriteBuffer(bufferTemplate1^, template1Length); // А потом сами данные
Просто пропускаем ненужные блоки:
Код:
FS.ReadBuffer(len, SizeOf(len)); // Считываем длину блока
FS.Position := FS.Position + len; // Пропускаем ненужный блок (вместо его чтения)
Ответить с цитированием
  #5  
Старый 21.11.2013, 18:41
kti kti вне форума
Прохожий
 
Регистрация: 21.11.2013
Сообщения: 10
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Цитата:
Просто пропускаем ненужные блоки:
Если я правильно понял - это при чтении, а как мне дописать в файл еще одну запись? В каком режиме создавать поток , fmOpenRead?
И как встать на конец файла перед записью нового потока?
FS.Position = EOF ? так? чтобы данные дописались к файлу

Код:
    FS := TFileStream.Create('c:\temp\test.dat', fmOpenRead); // ??
    FS.Position = EOF; // ???
// или нужно через FS.Position := FS.Position + len добираться до конца файла?
    FS.WriteBuffer(template1Length, SizeOf(template1Length)); // Сначала записываем размер данных
    FS.WriteBuffer(bufferTemplate1^, template1Length); // А потом сами данные
Ответить с цитированием
  #6  
Старый 21.11.2013, 19:02
kti kti вне форума
Прохожий
 
Регистрация: 21.11.2013
Сообщения: 10
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Все! разобрался сам. Достаточно было почитать про файловые потоки..

Код:
    FS := TFileStream.Create('c:\temp\test.dat', fmOpenReadWrite);
    FS.Seek(0, soFromEnd); // 
    FS.WriteBuffer(template1Length, SizeOf(template1Length)); // Сначала записываем размер данных
    FS.WriteBuffer(bufferTemplate1^, template1Length); // А потом сами данные

Остался один вопросик, что делает конструкция:

Код:
FS.create(FileName, fmCreate or fmOpenWrite)

т.е. если файл существует, то открывает для чтения/записи, а если нет то создает?
Если это так, то это то, что мне нужно
Ответить с цитированием
Ответ


Delphi Sources

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

Расширенный поиск
Опции просмотра
Комбинированный вид Комбинированный вид

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 07:53.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025