Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Для новичков > не типизированный файл запись/чтение


Автор: Rohoss 12.5.2008, 21:44
Можно ли хранить поток в не типизированном файле? Почему такой способ не проходит?

Код

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Edit1: TEdit;
    Edit2: TEdit;
    Edit3: TEdit;
    Memo1: TMemo;
    Memo2: TMemo;
    btnWrite: TButton;
    btnRead: TButton;
    procedure btnReadClick(Sender: TObject);
    procedure btnWriteClick(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;



var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.btnReadClick(Sender: TObject);
var
numMemo1,numMemo2,sizeMemo1,sizeMemo2:word;
NoTypeFile:file;
ms:TMemoryStream;
begin
ms:=TMemoryStream.Create;
AssignFile(NoTypeFile,'1.dat');
Reset(NoTypeFile,1);

BlockRead(NoTypeFile,numMemo1,2);
Seek(NoTypeFile,2);
BlockRead(NoTypeFile,sizeMemo1,2);

ShowMessage(IntToStr(sizeMemo1));

Seek(NoTypeFile,numMemo1);

ms.SetSize(sizeMemo1);
ms.Position:=0;
BlockRead(NoTypeFile,ms,sizeMemo1);


ms.Position:=0;
Memo1.Lines.LoadFromStream(ms);


end;

procedure TForm1.btnWriteClick(Sender: TObject);
var
numMemo1,numMemo2,sizeMemo1,sizeMemo2:word;
NoTypeFile:file;
ms:TMemoryStream;
begin
ms:=TMemoryStream.Create;
AssignFile(NoTypeFile,'1.dat');
Rewrite(NoTypeFile,1);

numMemo1:=8;
Memo1.Lines.SaveToStream(ms);
sizeMemo1:=ms.Size;


BlockWrite(NoTypeFile,numMemo1,2);
Seek(NoTypeFile,2);
BlockWrite(NoTypeFile,sizeMemo1,2);
Seek(NoTypeFile,numMemo1);
ms.Position:=0;

BlockWrite(NoTypeFile,ms,sizeMemo1);

ms.Clear;
Memo2.Lines.SaveToStream(ms);
sizeMemo2:=ms.Size;
ms.Position:=0;

numMemo2:=numMemo1+sizeMemo1;

Seek(NoTypeFile,4);
BlockWrite(NoTypeFile,numMemo2,2);

Seek(NoTypeFile,6);
BlockWrite(NoTypeFile,numMemo2,2);

ms.Position:=0;
Seek(NoTypeFile,numMemo2);
BlockWrite(NoTypeFile,ms,sizeMemo2);
ms.Clear;

CloseFile(NoTypeFile);

end;

end.

Автор: Snowy 13.5.2008, 16:31
Я чего-то не понимаю...
Зачем всё это, если у TMemoryStream и у TMemo.Lines есть методы SaveToFile и LoadFromFile...

Автор: Rohoss 15.5.2008, 00:46
Цитата(Snowy @  13.5.2008,  16:31 Найти цитируемый пост)
Я чего-то не понимаю...Зачем всё это, если у TMemoryStream и у TMemo.Lines есть методы SaveToFile и LoadFromFile...


Я хочу научиться хранить в не типизированном файле, данные разных типов и динамически – меняющейся длинны. Ну сделать что-то вроде своего типа файлов. 

Автор: Coder 15.5.2008, 07:14
А что после BlockWrite/Read нужно перемещать указатель - seek?  smile 

В эти функции нужно передавать буфер для чтения/записи в него из него. А TMemoryStream подхоит ли в качестве такого буфера?

Автор: SneG0K 15.5.2008, 08:34
Rohoss, а кто тебе мешает допустим использовать обычный текстовый файл, тока с форматом допустим *.roh?

Автор: Snowy 15.5.2008, 12:02
Ну создай TFileStream и сохрани в него через SaveToStream.
Забудь вообще о типе file. Это прошлый век.

Автор: Rohoss 16.5.2008, 00:23
Цитата(SneG0K @  15.5.2008,  08:34 Найти цитируемый пост)
Rohoss, а кто тебе мешает допустим использовать обычный текстовый файл, тока с форматом допустим *.roh?

А как я тогда запишу в него музыку и/или изображение?

Цитата(Coder @  15.5.2008,  07:14 Найти цитируемый пост)
В эти функции нужно передавать буфер для чтения/записи в него из него. А TMemoryStream подхоит ли в качестве такого буфера?

Хз, вот записывает, а читать чего-то не хочет… 

Цитата(Snowy @  15.5.2008,  12:02 Найти цитируемый пост)
Забудь вообще о типе file. Это прошлый век.

Ок, буду использовать TFileStream

А вообще может, кто знает в Инете статейку о создании своего типа файла? Мне нужно хранить в файле данные разных типов и разной длинны, причём количество различных данных тоже может манятся. А потом всё это нужно корректно прочитать.  Как это сделать лучше, может уже есть готовые решения? 

Автор: Snowy 16.5.2008, 00:46
Если не хочешь изобретать велосипед, просто используй zip.
Статей нет - свой формат аналогичен своему сетевому протоколу - на всё воля разработчика.
Тут стандартов нет.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)