求求大哥们了,我对这个字符串用流的方法读写整整“研究”三天啦!头也昏了,
眼也花了,还是没搞明白这个“读“的问题,为什么读出来的总是一些不正常的
东西,要么是乱符,要么什么也没有,有时候还出错误!(读流发生错误),反
正不能正确读出我写入的字符,请求大哥们帮我看看代码,哪里出错了,写入流的
那部份不能改!只请你帮我把读取的那段代码改正确.小妹在线等,只要正确,马
上给分。
procedure TForm1.Button1Click(Sender: TObject);//写
var
  str:string;
  Fs:TFileStream;
begin
    str:='爱你没商量';
    try
      Fs:=TFileStream.Create('c:\aaa.txt',fmCreate);
      //Fs.WriteBuffer(pchar(str)^,Length(str));//你不能用这句
      //Fs.WriteBuffer(str[1],Length(str));//你不能用这句
      Fs.WriteBuffer(str,Length(str));//只能用这句
    finally
      Fs.free;
    end;
end;procedure TForm1.Button2Click(Sender: TObject);//读
var
  str:string;
  fs:TFileStream;
begin
    try
      fs:=TFileStream.Create('c:\aaa.txt',fmOpenRead);
      SetLength(str,fs.size);//长度
      fs.ReadBuffer(str[1],fs.Size );
      RichEdit1.Text :=str;//如何在这里正确读出"爱你没商量"
    finally
      fs.free;
    end;
end;

解决方案 »

  1.   

    要不嫌麻烦,可以用TReader和TWriter否则,简单一点
    procedure WriteStrToStream(aStrValue: string; aStream: TStream);
    var
      vLen: Integer;
    begin
      vLen := Length(aStrValue);
      aStream.WriteBuffer(vLen, SizeOf(vLen));
      if vLen > 0 then
         aStream.WriteBuffer(aStrValue[1], vLen);
    end;procedure ReadStrFromStream(var aStrValue: string; aStream: TStream);
    var
      vLen: Integer;
    begin
      aStream.ReadBuffer(vLen, SizeOf(vLen));
      if vLen > 0 then
      begin
        SetLength(aStrValue, vLen);
        aStream.ReadBuffer(aStrValue[1], vLen);
      end
      else if vLen = 0 then
        aStrValue := ''
      else
        raise Exception.Create('Error');  
    end;
      

  2.   

    Button1Click中写进文件的内容就不对,怎么能期望读出来的会对呢,等一下,我找一下解决方法。
      

  3.   

    写入文件应该用
    Fs.WriteBuffer(str[1],Length(str));
    应为delphi中的string和c++中的char[xx]是不同的,你直接保存str保存入的是一段无用的内存。
      

  4.   

    alphax() :
       你代码里面用到了中括号,我最怕中括号和指针了,谢谢你给了我那么多代码
    ,不过不是我的正解。tonylk(tony):
       写入的代码是绝对正确的,一:我见过别人写的代码,可惜没到读出代码,
    二:这段写入代码是书上的一个例子,不过书上没有读出代码。 
      

  5.   

    function Cjt_AddtoFile(SourceFile, TargetFile: string): Boolean;
    var
      Target, Source: TFileStream;
      MyFileSize: integer;
    begin
      try
        Source := TFileStream.Create(SourceFile, fmOpenRead or fmShareExclusive);
        Target := TFileStream.Create(TargetFile, fmOpenWrite or fmShareExclusive);
        try
          Target.Seek(0, soFromEnd); //往尾部添加资源
          Target.CopyFrom(Source, 0);
          MyFileSize := Source.Size + Sizeof(MyFileSize); //计算资源大小,并写入辅程尾部
          Target.WriteBuffer(MyFileSize, sizeof(MyFileSize));
        finally
          Target.Free;
          Source.Free;
        end;
      except
        Result := False;
        Exit;
      end;
      Result := True;
    end;  其中参数SourceFile是要添加的文件, 参数TargetFile是被添加到的目标文件。比如说把a.exe添加到b.exe里面可以:Cjt_AddtoFile('a.exe', b.exe');如果添加成功就返回True否则返回假。
      

  6.   

    yxknet(哓哓) :
    谈Delphi编程中“流”的利用
                       陈经韬
    我全看过了,不能解决我的问题,谢谢你。
      

  7.   

    "爱你没商量"写到文件里面了吗?
    应该这样:
    fs.writebuffer(str[1],length(str));
      

  8.   

    靠!你上面的哪个读的程序,你声明了str:String;,这样的话,根本没有分配内存空间,你readBuffer什么呢?所谓的Buffer 是什么,即使一段存储区,你根本没有分派,怎么读?数据缓冲区一律使用c型字符串!Pchar,使用String白搭!String是有结构类型!
      

  9.   

    如果你认为写入的是正确的话,用ultraedit活notepad打开看看