unit Unit1;interfaceuses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;type
  TForm1 = class(TForm)
    Memo1: TMemo;
    Button1: TButton;
    Button2: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;var
  Form1: TForm1;implementation
type
TExe_Data_Record =record
    Hex:PChar;
  end;
{$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);
var
  Exe_Data_Record:TExe_Data_Record;
  Exe_Data_Record_MS:TMemoryStream;
begin
  Memo1.Clear;
  Exe_Data_Record_MS := TMemoryStream.Create;
  Exe_Data_Record_MS.LoadFromFile('c:\eabesour.dat');
  Exe_Data_Record_MS.Position := 0;
  while Exe_Data_Record_MS.Position < Exe_Data_Record_MS.Size do
  begin
    Exe_Data_Record_MS.Read(Exe_Data_Record, SizeOf(Exe_Data_Record));
    Memo1.Lines.Add(Exe_Data_Record.hex);
  end;
  Exe_Data_Record_MS.Free;
end;procedure TForm1.Button2Click(Sender: TObject);
var
  Exe_Data_Record:TExe_Data_Record;
  Exe_Data_Record_MS:TMemoryStream;
begin
  Exe_Data_Record_MS := TMemoryStream.Create;
  Exe_Data_Record_MS.Position := 0;
  Exe_Data_Record.Hex:='windows xp';
  Exe_Data_Record_MS.Write(Exe_Data_Record,SizeOf(Exe_Data_Record));
  Exe_Data_Record.Hex:='windows 2000';
  Exe_Data_Record_MS.Write(Exe_Data_Record,SizeOf(Exe_Data_Record));
  Exe_Data_Record.Hex:='windows me';
  Exe_Data_Record_MS.Write(Exe_Data_Record,SizeOf(Exe_Data_Record));
  Exe_Data_Record.Hex:='windows 7';
  Exe_Data_Record_MS.Write(Exe_Data_Record,SizeOf(Exe_Data_Record));
  Exe_Data_Record.Hex:='windows server professional';
  Exe_Data_Record_MS.Write(Exe_Data_Record,SizeOf(Exe_Data_Record));
  Exe_Data_Record_MS.SaveToFile('c:\eabesour.dat');
  Exe_Data_Record_MS.Free;
end;end.写入和读取这两个过程写到同一个程序就可以正常读取,但要是把读取过程写到其它程序,或是程序发生变动,那么读出的都是乱码,但是我的格式都是对的啊,不知道问题出在哪?

解决方案 »

  1.   

    可能你还有几个地方定义了相同的变量名TExe_Data_Record
      

  2.   

    很多程序的数据结构都不一样的,dat也没有固定的格式,没有统一的标准
      

  3.   

    建议楼主仔细看看 tstream 的 read、write 方法:第一个参数是缓冲区的起始位置,第二个参数是要读取、写入数据大大小。你这些 Write(Exe_Data_Record,SizeOf(Exe_Data_Record)); 完全错了,要写入字符串,可以先写入内容长度,再写入内容,如:S: string;
    nLen: Integer;S := 'windows xp';nLen := Length(S);
    stream.Write(nLen, SizeOf(nLen));
    stream.Write(PChar(S)^, Length(S));读出来时先读长度,开辟足够的缓冲区然后读:stream.Read(nLen, SizeOf(nLen));
    SetLength(S, nLen);
    stream.Read(PChar(S)^, Length(S));
      

  4.   

    应该还是编码问题,可用TEncoding试试。
      

  5.   

    自己找到答案了,问题不能用PChar;