var
Wave1ReceBuf:array[0..30000]of word;
Wave2ReceBuf:array[0..30000]of word;
.
.
procedure TForm1.Button1Click(Sender: TObject); 
   var 
   MyFile:TMemoryStream; 
   iLen:Int64; 
   Begin 
   If savedialog1.Execute then 
   begin 
   iLen:=0; 
   MyFile:=TMemoryStream.Create; 
   MyFile.SavetoFile(opendialog1.FileName); 
   iLen:=MyFile.Size;//获得指定TXT文件的大小 
   SetLength(FileBuf,iLen);//设置动态数组的长度为TXT文件的大小 
   MyFile.writeBuffer(Wave1ReceBuf[0],iLen);//写入TXT文件全部数据 
     MyFile.writeBuffer(Wave2ReceBuf[0],iLen);//写入TXT文件全部数据
   FreeAndNil(MyFile); 
   end; 
  end; procedure TForm1.Button2Click(Sender: TObject); 
   var 
   MyFile:TMemoryStream; 
   iLen:Int64; 
   Begin 
   If opendialog1.Execute then 
   begin 
   iLen:=0; 
   MyFile:=TMemoryStream.Create; 
   MyFile.LoadFromFile(opendialog1.FileName); 
   iLen:=MyFile.Size;//获得指定TXT文件的大小 
   SetLength(FileBuf,iLen);//设置动态数组的长度为TXT文件的大小 
   MyFile.ReadBuffer(Wave1ReceBuf[0],iLen);//读取TXT文件全部数据 
     MyFile.ReadBuffer(Wave2ReceBuf[0],iLen);//读取TXT文件全部数据
   FreeAndNil(MyFile); 
   end; 
  end; 
总感觉不对,如果我想保存为txt文件,然后读出数据后,还要转换,strtoint().比如两个缓冲,怎么识别呢?

解决方案 »

  1.   

    你要使用一个结构啊。比如上面的数据,结构可以这样定义:
    TStrItem=Record
      index:integer;//索引,相当于等号前面的1
      Length:integer;//内容长度,相当于6422*17014的字符串长度
      str:string;//字符串的内容
    end;TStr=Record
      StrItemCount:integer;//数组的数量
      item:array of TStrItem;
    end;
    在使用的时候,创建这个结构,然后进行读写操作,具体方法如下:
    写入流:
      1,先写入StrItemCount;
      2,然后使用循环写入item内容,每个item内容,先写index,在写Length,最后写str。
    读取的时候是关键,这样读取:
      1,先读入sizeof(integer)长度的流数据,这个就是StrItemCount的数值,根据这个数值循环读取item内容;
      2,每个item内容这样读取:(1)先读取sizeof(integer)长度的数据,为index的内容;(2)再读取sizeof(integer)长度的数据,为后面真正字符串的内容长度;(3)最后根据长度,读取这个长度的数据,就是str的内容了;
      3,通过循环,数据就读出来了。别的结构,你根据这个思路,自己组织了
      

  2.   

    用STRINGLIST不可以吗?
    使用=后的数据可以用
    s:=rightstr(stringlist.strings[i],pos('=',stringlist.strings[i],));
    读取大文本文件,比如几十兆以上的时候建议使用流读取快,小文件用stringlist就够用了。
    你试试,没那么麻烦!
      

  3.   

    to yshuui:
    我之前是Iinifile读去的。一行一行的读,所以打开文件的时候很慢
    现在就是想用流来做,感觉挺模糊的,肯请大家指点!
      

  4.   

    var
       List:TStringList;
       i,p:Integer;
       s:string;
    begin
       List:=TStringList.Create;
       List.LoadFromFile('  ');
       for i:=0 to List.Count-1 do
       begin
          s:=List.ValueFromIndex[i];
          p:=Pos('*',s);
          ShowMessage(Copy(s,1,p-1)+'     '+Copy(s,p+1,1000));
       end;
       List.Free;
    end;
       
       
      

  5.   

    我还是受之前的TXT文件的影响,其实我是在想升级以前的一个程序,那时是保存成TXT文件的
    用TIniFile读的,后来在使用过程中发现当数据稍微大一点的时候,读出的速度特别慢。现在
    我想用流来读写,不用保存成TXT文本文件,只要求能顺利读出就可以了!TO:stherix :这样读数据跟ini读速度应该是差不多的吧
    我的数据大概几百k到1m,或者再大点!
    谢谢各位的参与哦!
      

  6.   

    没问题,用stringlist读到很快,我测试过70多兆的文本,大概几秒就载入了,反正时间很短,没有具体测试过。流读取确实快,但是不好控制。
    同意11楼的写法。
      

  7.   

    rightstr()是inifile单元里的,不用自己写。
      

  8.   

    哦,对不起,我写错了。是这样的。
    s:=rightstr(stringlist.strings[i],length(stringlist.strings[i])-pos('=',stringlist.strings[i],)); 
      

  9.   

    TStringList.LoadFromFile
    其实就是用流实现的,你可以看源代码
    几百K,几M的文件很小的
      

  10.   

    还有个问题,如何释放自己的缓冲呢
    比如说for i:=0 to 3000000 do 
    wave1recebuffer[i]=inc(i)
      

  11.   

    你所说的“不用保存成TXT文本文件,只要求能顺利读出就可以了”非常容易实现。你所贴出来的代码错误之处太多了。你对流指针了解不够。看看你写的第一段:procedure   TForm1.Button1Click(Sender:   TObject);   
         var   
         MyFile:TMemoryStream;   
         iLen:Int64;   
         Begin   
         If   savedialog1.Execute   then   
         begin   
         iLen:=0;   
         MyFile:=TMemoryStream.Create;   
          MyFile.SavetoFile(opendialog1.FileName);   
         iLen:=MyFile.Size;//获得指定TXT文件的大小  这里永远为0,因为没有载入文件。 
         SetLength(FileBuf,iLen);//设置动态数组的长度为TXT文件的大小 请注意你的数组没有动态定义,你这样写是画蛇添足  
         MyFile.writeBuffer(Wave1ReceBuf[0],iLen);//写入TXT文件全部数据   
              MyFile.writeBuffer(Wave2ReceBuf[0],iLen);//写入TXT文件全部数据 
         FreeAndNil(MyFile);   
         end;   
      end;   
    再看看你第二段:procedure   TForm1.Button2Click(Sender:   TObject);   
         var   
         MyFile:TMemoryStream;   
         iLen:Int64;   
         Begin   
         If   opendialog1.Execute   then   
         begin   
         iLen:=0;   
         MyFile:=TMemoryStream.Create;   
         MyFile.LoadFromFile(opendialog1.FileName);   
         iLen:=MyFile.Size;//获得指定TXT文件的大小   
         SetLength(FileBuf,iLen);//设置动态数组的长度为TXT文件的大小  
    下面的读取是什么意思呢?流指针在哪呢?读什么呢?我看不明白。如果在首部,我还是头一次见到把数据流写在文件头部的。 
         MyFile.ReadBuffer(Wave1ReceBuf[0],iLen);//读取TXT文件全部数据   
              MyFile.ReadBuffer(Wave2ReceBuf[0],iLen);//读取TXT文件全部数据 
         FreeAndNil(MyFile);   
         end;   
      end;   
    另外,你为什么要用ReadBuffer呢?用它的话必须要有try,否则你就不要用它。
      

  12.   

    谢谢楼上的热情指导,怪我不够严谨!确实对流很不熟悉!
    那只是抛砖引玉啊,嘿嘿。。
    我试了前几楼的方法。用Tsringlist读出文件,确实要快的多
    ,基本够用。可是又有问题了。内存用的很多,偶尔还出现内存泄露!
    我知道问题出在内存没有释放。可具体怎么做,还在找方法
    再次感谢大家热情相助
      

  13.   

    to 20楼
    ok,没问题。现在就加分,就当给大家拜拜年!