![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
|
|
#1
|
|||
|
|||
|
Подскажите, уважаемые, никак не получается, в делфи новичек...
В общем переделываю чужую программу.. там идет сохранение буфера в файл, вот такой кусок Код:
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
|
||||
|
||||
|
Примерно так:
Код:
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
|
|||
|
|||
|
Заработало! Спасибо огромное! т.е. по такому-же принципу я могу любые данные сохранить.. ясно
У меня еще пару вопросов если можно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
|
||||
|
||||
|
Цитата:
Почему в той программе сделано через TMemoryStream я не знаю. Цитата:
Код:
FS.ReadBuffer(len, SizeOf(len)); // Считываем длину блока FS.Position := FS.Position + len; // Пропускаем ненужный блок (вместо его чтения) |
|
#5
|
|||
|
|||
|
Цитата:
И как встать на конец файла перед записью нового потока? 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
|
|||
|
|||
|
Все! разобрался сам. Достаточно было почитать про файловые потоки..
Код:
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) т.е. если файл существует, то открывает для чтения/записи, а если нет то создает? Если это так, то это то, что мне нужно |