我想从文件里读出数据放到数组里。就这么简单,结果下段程序错了,能告诉我错在哪里吗?
没多少可用分了,我这几天挣到了再加,急。
type
    TAArray = array of Integer;
end;procedure TForm1.Button1Click(Sender: TObject);
const
    TMP_COUNT=50;
var
    m: array[0..999] of TAArray;
    i: Integer;
    sFile:string;
begin
    sFile:='C:\WINDOWS\system32\x.xx';
    for i := Low(m) to High(m) do SetLength(m[i], TMP_COUNT);
    if FileExists(sFile) then
        LoadDatafromFile(sFile, m[0][0], Length(m) * TMP_COUNT * SizeOf(Integer));
end;procedure TForm1.LoadDatafromFile(const AFileName: string; var AData; const ASize: Integer);
const
    BLOCK_SIZE = 1024;
var
    BytesRead, BytesToWrite, Count: Integer;
    F: file of Byte;
    pTemp: Pointer;
    mData: array of Byte;
begin
   ZeroMemory(@AData, ASize);   ///////////////////错
   AssignFile(F, AFileName);
    Reset(F);
   try
       Count := FileSize(F);
        setlength(mData, Count);
        pTemp := @mData[0];
        BytesRead := BLOCK_SIZE;
        while (BytesRead = BLOCK_SIZE) do
        begin
            BytesToWrite := Min(Count, BLOCK_SIZE);
            BlockRead(F, pTemp^, BytesToWrite, BytesRead);
            pTemp := Pointer(Longint(pTemp) + BLOCK_SIZE);
            Count := Count - BytesRead;
        end;
    finally
        CloseFile(F);
    end;
   Move(mData[0], AData, ASize);  ///////////////////////////错
end;

解决方案 »

  1.   

    m: array[0..999] of TAArray;这是个二维数组,你应该对0..999个TAArray进行分配空间
      

  2.   

    for i := Low(m) to High(m) do SetLength(m[i], TMP_COUNT);
    这不是分配了吗
      

  3.   

    LoadDatafromFile(sFile, m[0][0], Length(m) * TMP_COUNT * SizeOf(Integer));
    m[0] , m[1]...可能不在一个连续的空间里,array of array时,其实是一个指针数组,因此分配的内存完全可能不连续
      

  4.   

    那怎么办呢?怎么把文件里的数据读到m: array[0..999] of TAArray;
      

  5.   

    动态数组 系统会多分配一些空间进行管理的 ,你用move 破坏他的结构了你可以用for 来复制到每个动态数组中
      

  6.   

    搞的那么麻烦
    procedure TForm1.Button1Click(Sender: TObject);
    var
      fmem: TFileStream;
      arrByte: TBytes;
    begin
      fmem := TFileStream.Create('e:\1.txt',fmOpenRead);
      setlength(arrbyte,fmem.Size);
      fmem.Read(arrbyte[0],fmem.Size);
      fmem.Free;
    end;
      

  7.   

    LS在使用流的时候要先Seek(0,soFromBeginning); 
      

  8.   

    更正一下,读取流的时候要seek,创建不需要
      

  9.   


    type
      Tfoo  = record
        Values  : array of Integer;
        m : array[0..999]of PIntegerArray;
      end;procedure TForm1.Button1Click(Sender: TObject);
    const
      TMP_COUNT=50;
    var
      bar: Tfoo;
      i: Integer;
    begin
      SetLength(bar.Values, TMP_COUNT*Length(bar.m));
      for i:=0 to High(bar.m) do
        bar.m[i]  := @bar.Values[i*TMP_COUNT];
      with TFileStream.Create(sFile, fmOpenRead) do
      try
        Read(bar.Values[0], Length(bar.Values) * SizeOf(bar.Values[0]))
        // or:
        //Read(bar.m[0][0], Length(bar.m)*TMP_COUNT * SizeOf(bar.Values[0]))
      finally
        Free
      end;
    end;