我有一个文本文件,现在我想将其读出来保存为二进制文件,然后再程序中再读取该二进制文件,请问该如何做到?我使用Tmemorystream来读写二进制文件,但是一直没有弄成功啊,大家帮我看看是怎么回事
//文件65.txt的内容
 1  2  3  4  5  6
 1  2  3  6  9 10
 1  2  3  7  8 10
 1  2  4  6  7  8
然后是读出该文本文件的内容
procedure TForm1.Button1Click(Sender: TObject);
var
  myFile:TextFile;
  q,temp1 : string;
  test : Integer;
begin
   AssignFile(myfile,'F:\\Delphi\\65.txt');
   Reset(myfile);
   while not Eof(myfile) do
     begin
        Readln(myfile, q);
        temp2 := temp2 + q ; //将文本文件中的内容保存到temp2全局变量中
        ListBox1.Items.Add(q);
     end;
   closefile(myfile);
   //可以正确读取出来,temp2的内容和文本文件中的内容相同
end;//然后开始将该内容写进二进制文件
procedure TForm1.Button3Click(Sender: TObject);
var
  ms:tmemorystream;
  t,q : string;
  itt : Integer;
begin
   ms := TMemoryStream.Create ;
   t := temp2 ; //将文本中读取的内容赋值给t,再保存
   ms.Write(t,length(t));
   ms.SaveToFile('c:\test.test');
   ms.free;
end;//然后是读取该二进制文件
procedure TForm1.Button2Click(Sender: TObject);
var
  ms : Tmemorystream ;
   p,q,iTemp:string;
   i,j : Integer;
   iftt : Integer;
begin
   ms := TMemoryStream.Create ;
   ms.loadfromFile('c:\test.test');
   ms.read(p,238);
   ms.free;
   listbox1.Items.Add(p);
end;
但是却怎么也读取不了,老是出错,请各位大侠看看问题出在那里

解决方案 »

  1.   

    这个问题我回过多次了,string是指针,不能直接写入文件或从文件中读的,这样可以,在//这里
    的地方是我改过的
    procedure TForm1.Button1Click(Sender: TObject);
    var
      myFile:TextFile;
      q,temp1 : string;
      test : Integer;
    begin
       AssignFile(myfile,'e:\temp\65.txt');
       Reset(myfile);
       while not Eof(myfile) do
         begin
            Readln(myfile, q);
            temp2 := temp2 + q ; //将文本文件中的内容保存到temp2全局变量中
            ListBox1.Items.Add(q);
         end;
       closefile(myfile);
       //可以正确读取出来,temp2的内容和文本文件中的内容相同
    end;
    procedure TForm1.Button2Click(Sender: TObject);
    var
      ms:tmemorystream;
      t,q : string;
      itt : Integer;
    begin
       ms := TMemoryStream.Create ;
       t := temp2 ; //将文本中读取的内容赋值给t,再保存
       ms.Write(pchar(t)^,length(t));//这里   ms.SaveToFile('e:\temp\65b.txt');
       ms.free;
    end;procedure TForm1.Button3Click(Sender: TObject);
    var
      ms : Tmemorystream ;
       p,q,iTemp:string;
       i,j : Integer;
       iftt : Integer;
       p1:array[0..238] of char;//这里
    begin
       ms := TMemoryStream.Create ;
       ms.loadfromFile('e:\temp\65b.txt');
       ms.read(p1,238);  //这里
       ms.free;
       p:=p1;
       listbox1.Items.Add(p);
    end;
      

  2.   

    谢谢楼上兄弟的回答,我改成ms.Write(pchar(t)^,length(t))确实没有问题,但是为什么这样保存以后我用记事本打开那个文件,竟然可以看到文件的内容的?一般二进制文件用记事本打开看到的是乱码的啊,难道用tmemorystream来写的二进制是可以观察到的吗?怎样解决这个问题?大侠帮帮忙,不胜感激
      

  3.   

    你的内容本来就是可见字符啊,如果把1写成chr(1),再写入文件,你看记事本还能不能看?
      

  4.   

    to h2yang(小青) 
    你说的是什么意思呢?如果我想将文本内容写入二进制文件里,但又不想给用户直接可以打开记事本观看,那该怎么做呢?
      

  5.   

    那你就要用某种方式加密(如xor等)
      

  6.   

    procedure TForm1.Button1Click(Sender: TObject);  //读文件
    var
      myFile:TextFile;
      q,temp1 : string;
      test : Integer;
    begin
       AssignFile(myfile,'e:\temp\65.txt');
       Reset(myfile);
       while not Eof(myfile) do
         begin
            Readln(myfile, q);
           temp2 := temp2 + q ; //将文本文件中的内容保存到temp2全局变量中
            ListBox1.Items.Add(q);
         end;
       closefile(myfile);
       //可以正确读取出来,temp2的内容和文本文件中的内容相同
    end;procedure TForm1.Button2Click(Sender: TObject); //加密写文件
    var
      ms:tmemorystream;
      t,q : string;
      itt : Integer;
    begin
       ms := TMemoryStream.Create ;
       t := temp2 ; //将文本中读取的内容赋值给t,再保存
       for itt:=1 to  length(t) do
         t[itt]:=char(byte(t[itt]) xor $55);   ms.Write(pchar(t)^,length(t));//这里   ms.SaveToFile('e:\temp\65b.txt');
       ms.free;
    end;procedure TForm1.Button3Click(Sender: TObject); //解密写文件
    var
      ms : Tmemorystream ;
       p,q,iTemp:string;
       i,j : Integer;
       l,iftt : Integer;   p1:array[0..238] of char;//这里
    begin
       ms := TMemoryStream.Create ;
       ms.loadfromFile('e:\temp\65b.txt');
       l:=ms.Size;
       ms.read(p1,238);  //这里
       for iftt:=0 to l-1 do
          p1[iftt]:=char(byte(p1[iftt]) xor $55);
       p1[l]:=chr(0);
       ms.free;
       p:=p1;
       listbox1.Items.Add(p);
    end;
    如果,你的65.txt中中文,那么,65b.txt用记事本打开为乱码,但可用程序读出
    (程序执行必须按button1->2->3)
      

  7.   

    注释有一小错:
    procedure TForm1.Button3Click(Sender: TObject); //解密读文件