读出时是一堆乱码,我到底错在哪儿?
unit Unit1;interfaceuses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Grids, StdCtrls;type
  TForm1 = class(TForm)
    Button1: TButton;
    Edit1: TEdit;
    StringGrid1: TStringGrid;
    Edit2: TEdit;
    Button2: TButton;
    Edit3: TEdit;
    Edit4: TEdit;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
  TestRec = record
    test1: string;
    test2: string;
    test3: single;
  end;  TestRecord = record
    test1: string;
    test2: array of TestRec;
  end;
var
  Form1: TForm1;implementation{$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);
var
  i, j: integer;
  testStream: TFileStream;
  Test: TestRecord;
begin
  Setlength(Test.test2, 3);
  test.test1 := '头信息';
  for i := Low(Test.test2) to High(Test.test2) do
  begin
    Test.test2[i].test1 := 'test1';
    Test.test2[i].test2 := 'test2';
    Test.test2[i].test3 := 3.2;
  end;
  testStream := TFileStream.Create('c:\test.txt', fmCreate);
  j := High(Test.test2) + 1;
  edit3.Text := inttostr(j);
  testStream.Position := 0;
  testStream.Write(j, sizeof(j));
  testStream.Write(test.test1, Sizeof(test.test1));
  for I := Low(test.test2) to High(test.test2) do
    testStream.Write(test.test2[I], SizeOf(Test.test2[I]));  FreeAndNil(testStream);end;procedure TForm1.Button2Click(Sender: TObject);
var
  i, j: integer;
  testStream: TFileStream;
  TestOpen: TestRecord;
begin
  testStream := TFileStream.Create('c:\test.txt', fmOpenRead);
  testStream.Position := 0;
  testStream.Read(j, sizeof(j));
  testStream.Read(TestOpen.test1, sizeOf(TestOpen.test1));
  Setlength(TestOpen.test2, j);
  for i := low(TestOpen.test2) to High(TestOpen.test2) do
  begin
    testStream.Read(TestOpen.test2[i], SizeOf(TestOpen.test2[I]));
    j:=1;
  end;  FreeAndNil(testStream);
  Edit1.Text := TestOpen.test1;
  edit4.Text := inttostr(j);
  for i := 0 to StringGrid1.RowCount - 1 do
  begin
    StringGrid1.Cells[1, i + 1] := '';
    StringGrid1.Cells[2, i + 1] := '';
    StringGrid1.Cells[3, i + 1] := '';
  end;
  for i := Low(TestOpen.test2) to High(TestOpen.test2) do
  begin
    StringGrid1.Cells[1, i + 1] := TestOpen.test2[i].test1;
    StringGrid1.Cells[2, i + 1] := TestOpen.test2[i].test2;
    StringGrid1.Cells[3, i + 1] := FormatFloat('0.00', TestOpen.test2[i].test3);
  end;
end;end.

解决方案 »

  1.   

    //按你的思路改了一下,但是这样效率太低
    procedure TForm1.Button1Click(Sender: TObject);
    var
      len,i, j: integer;
      testStream: TFileStream;
      Test: TestRecord;
    begin
      Setlength(Test.test2, 3);
      test.test1 := '头信息';
      for i := Low(Test.test2) to High(Test.test2) do
      begin
        Test.test2[i].test1 := 'test1';
        Test.test2[i].test2 := 'test2';
        Test.test2[i].test3 := 3.2;
      end;
      testStream := TFileStream.Create('c:\test.txt', fmCreate);
      j := High(Test.test2) + 1;
      edit3.Text := inttostr(j);
      testStream.Position := 0;
      testStream.Write(j, sizeof(j));
      len:=length(test.test1);
      testStream.Write(len,sizeof(len));
      testStream.Write(test.test1[1], len);  for I := Low(test.test2) to High(test.test2) do
      begin
       len:=length(test.test2[i].test1);
       testStream.Write(len,sizeof(len));
       testStream.Write(test.test2[i].test1[1], len);
       len:=length(test.test2[i].test2);
       testStream.Write(len,sizeof(len));
       testStream.Write(test.test2[i].test2[1], len);
       testStream.Write(test.test2[i].test3, sizeof(test.test2[i].test3));
      end;
      FreeAndNil(testStream); end;procedure TForm1.Button2Click(Sender: TObject);
    var
      i, j,len: integer;
      testStream: TFileStream;
      TestOpen: TestRecord;
    begin
      testStream := TFileStream.Create('c:\test.txt', fmOpenRead);
      testStream.Position := 0;
      testStream.Read(j, sizeof(j));
      testStream.Read(len, sizeof(len));
      setlength(testOpen.test1,len);
      testStream.Read(TestOpen.test1[1], len);
      Setlength(TestOpen.test2, j);
      i:=0;
      for i := low(TestOpen.test2) to High(TestOpen.test2) do
      begin
        testStream.Read(len, sizeof(len));
        Setlength(TestOpen.test2[i].test1,len);
        testStream.Read(TestOpen.test2[i].test1[1], len);
         testStream.Read(len, sizeof(len));
         Setlength(TestOpen.test2[i].test2,len);
        testStream.Read(TestOpen.test2[i].test2[1], len);
        testStream.Read(TestOpen.test2[i].test3, sizeof(TestOpen.test2[i].test3));  end;  FreeAndNil(testStream);
      Edit1.Text := TestOpen.test1;
      edit4.Text := inttostr(j);
      for i := 0 to StringGrid1.RowCount - 1 do
      begin
        StringGrid1.Cells[1, i + 1] := '';
        StringGrid1.Cells[2, i + 1] := '';
        StringGrid1.Cells[3, i + 1] := '';
      end;
      for i := Low(TestOpen.test2) to High(TestOpen.test2) do
      begin
        StringGrid1.Cells[1, i + 1] := TestOpen.test2[i].test1;
        StringGrid1.Cells[2, i + 1] := TestOpen.test2[i].test2;
        StringGrid1.Cells[3, i + 1] := FormatFloat('0.00', TestOpen.test2[i].test3);
      end;
    end;
      

  2.   

    string 是不定長的, 所以, 寫沒問題, 讀的時候, 無法确認有多長, 修改如下就可:
      TestRec = record
        test1: string[255];
        test2: string[255];
        test3: single[255];
      end;
      TestRecord = record
        test1: string[255];
        test2: array of TestRec;
      end;
      

  3.   

    TestRec = record
        test1: string[255];
        test2: string[255];
        test3: single[255];
      end;
      TestRecord = record
        test1: string[255];
        test2: array of TestRec;
      end;
      

  4.   

    俺覚得:如果只是读和写,
    用TFileStream不如用Textfile更簡易。