Показать сообщение отдельно
  #1  
Старый 03.06.2010, 20:41
Tonyy Tonyy вне форума
Новичок
 
Регистрация: 05.04.2010
Сообщения: 85
Репутация: 10
По умолчанию как работать с файлами большого объема?

Код:
type
    TH400 = record                         //описываем заголовок файла
         b1,b2,b3:longint;
         b4,b5,b6,b7,b8,b9,
         b10,b11,b12,b13,b14,
         b15,b16,b17,b18,b19,
         b20,b21,b22,b23,b24,b25,b26,b27:word;
     end;
     THeadTras = record                   //описываем заголовок одной трассы
         b1,b2,b3,b4,b5,b6,b7:longint;
         b8,b9,b10,b11:word;
         b12,b13,b14,b15,b16,b17,b18,b19:longint;
         b20,b21:word;
         b22,b23,b24,b25:longint;
         b26,b27,b28,b29,b30,b31,b32,b33,b34,b35,b36,b37,
         b38,b39,b40,b41,b42,b43,b44,b45,b46,b47,b48,b49,
         b50,b51,b52,b53,b54,b55,b56,b57,b58,b59,b60,b61,
         b62,b63,b64,b65,b66,b67,b68,b69,b70,b71:word;
         b72,b73,b74,b75,b76,b77,b78,b79:longint;
         b80,b81,b82,b83,b84,b85,b86,b87,b88,b89,b90,b91,b92,b93:word;
     end;
     THTras = record                       //описываем трассу, что состоит из заголовка и массива данных
         HeadTras:THeadTras;
         Data: array[1..1000] of single;
     end;
     TFN = record                          // описываем ту часть файла, которая образует суть сейсмограммы и может повторятся несколько раз
         Tras: array  of THTras;
     end;
  TForm1 = class(TForm)
    S1: TStringGrid;
    S2: TStringGrid;
    S3: TStringGrid;
    Button1: TButton;
    O1: TOpenDialog;
    E1: TEdit;
    E2: TEdit;
    procedure Button1Click(Sender: TObject);
    end;
var
  Form1: TForm1;
implementation
{$R *.dfm}
function SwapDWorD(X:DWord):dword;assembler; //функция для свопа 32х битного целого цисла
 asm
 bswap eax
 end;
procedure TForm1.Button1Click(Sender: TObject);
var
F    : TFILEStream;    // переменная для связи с файлом
H400 : TH400;          // переменная для заголовка файла
FN   : TFN;            // переменная для сбора всех трас сейсмограммы
//seg  : array[1..2] of TFN;
i,j,k,index:integer;   //счетчики
l:real;                // для хранения кол-во FN
buf:single;            // дальше для свопа чисел с плавающей точкой IEEE
dd:array [0..3] of  byte absolute buf;
temp:byte;
begin
IF O1.Execute then
f:=TfileStream.Create(o1.FileName,fmOpenRead,fmShareDenyNone);
f.seek(3200,soFromcurrent);
f.Read(H400,sizeof(TH400)); //считываем заголовок файла
 s1.Cells[1, 1]:=INTtostr(swapdword(H400.b1));
 s1.Cells[1, 2]:=INTtostr(swapdword(H400.b2));
 s1.Cells[1, 3]:=INTtostr(swapdword(H400.b3));
 s1.Cells[1, 4]:=INTtostr(swap(H400.b4));
 s1.Cells[1, 5]:=INTtostr(swap(H400.b5));
 s1.Cells[1, 6]:=INTtostr(swap(H400.b6));
 s1.Cells[1, 7]:=INTtostr(swap(H400.b7));
 s1.Cells[1, 8]:=INTtostr(swap(H400.b8));
 s1.Cells[1, 9]:=INTtostr(swap(H400.b9));
 s1.Cells[1,10]:=INTtostr(swap(H400.b10));
 s1.Cells[1,11]:=INTtostr(swap(H400.b11));
 s1.Cells[1,12]:=INTtostr(swap(H400.b12));
 s1.Cells[1,13]:=INTtostr(swap(H400.b13));
 s1.Cells[1,14]:=INTtostr(swap(H400.b14));
 s1.Cells[1,15]:=INTtostr(swap(H400.b15));
 s1.Cells[1,16]:=INTtostr(swap(H400.b16));
 s1.Cells[1,17]:=INTtostr(swap(H400.b17));
 s1.Cells[1,18]:=INTtostr(swap(H400.b18));
 s1.Cells[1,19]:=INTtostr(swap(H400.b19));
 s1.Cells[1,20]:=INTtostr(swap(H400.b20));
 s1.Cells[1,21]:=INTtostr(swap(H400.b21));
 s1.Cells[1,22]:=INTtostr(swap(H400.b22));
 s1.Cells[1,23]:=INTtostr(swap(H400.b23));
 s1.Cells[1,24]:=INTtostr(swap(H400.b24));
 s1.Cells[1,25]:=INTtostr(swap(H400.b25));
 s1.Cells[1,26]:=INTtostr(swap(H400.b26));
 s1.Cells[1,27]:=INTtostr(swap(H400.b27));
                  
l:=(f.Size-3600)/(240*swap(H400.b4)+4*swap(H400.b8)*swap(H400.b4));  //узнаем кол-во сейсмограмм.
                                                                     // для этого из всего //объема файла вычитаем его не повторяющиеся заголовки и делим на //повторяющуюся часть
e1.Text:=Floattostr(l);
s2.RowCount:=94;           // для таблицы задаем ее свойства
s2.ColCount:=swap(H400.b4)+1; //кол-во трасс храниться в переменной Н400.b4
s3.RowCount:=swap(H400.b8)+1; // кол-во дискретов, воборки хранится в переменной H400.b4
s3.ColCount:=swap(H400.b4)+1;
 f.Seek(340,soFromcurrent);   //заголовок файла, который мы считываем //объемом 400 байт, а мы считали только 60, поэтому переводим курсор //на нужную позицию
  // for index :=1 to 2 do begin
  SETLength(fn.Tras,swap(H400.b4));
  f.Read(fn,sizeof(fn));      //читаем в структуру FN переодическую часть
    for k:=0 to swap(H400.b4)-1 do begin    //запускаем счетчик, чтобы вывести данные заголовка трассы в соответствующие ячейки таблицы
    s2.Cells[k, 1]:=INTtostr(swapdword(fn.tras[k].HeadTras.b1));
    ......................................................................................
    s2.Cells[k, 7]:=INTtostr(swapdword(fn.tras[k].HeadTras.b7));
    s2.Cells[k, 8]:=INTtostr(swap(fn.tras[k].HeadTras.b8));
  ........................................................................................
    s2.Cells[k,11]:=INTtostr(swap(fn.tras[k].HeadTras.b11));
    s2.Cells[k,12]:=INTtostr(swapdword(fn.tras[k].HeadTras.b12));
    ........................................................................................
    s2.Cells[k,19]:=INTtostr(swapdword(fn.tras[k].HeadTras.b19));
    s2.Cells[k,20]:=INTtostr(swap(fn.tras[k].HeadTras.b20));
    s2.Cells[k,21]:=INTtostr(swap(fn.tras[k].HeadTras.b21));
    s2.Cells[k,22]:=INTtostr(swapdword(fn.tras[k].HeadTras.b22));
    ........................................................................................
    s2.Cells[k,25]:=INTtostr(swapdword(fn.tras[k].HeadTras.b25));
    s2.Cells[k,26]:=INTtostr(swap(fn.tras[k].HeadTras.b26));
    ...............................................................................
    s2.Cells[k,93]:=INTtostr(swap(fn.tras[k].HeadTras.b93));
    
          for j:=1 to swap(H400.b8) do begin                       //свопируем данные выборки
          buf:=fn.tras[k].data[j];
                          for i:=0 to 1 do begin
                          temp:=dd[i];
                          dd[i]:=dd[3-i];
                          dd[3-i]:=temp;
                          end;
           s3.Cells[k,j]:=floattostr(buf);               //каждой ячейке таблицы присваиваем  соответсвующее значение выборки
           fn.tras[k].Data[j]:=buf;                     // заменяем данные на свопированные
           end;
    end;
  //  seg[index]:=fn;   //здесь хотелось бы прочитать второй fn, но что бы я для этого не делал результат - либо стек перегружен, либо аксес виолейшен:(
 //  end;
f.Free;
end;
end.
подскажите как исправить ошибку. еще надо бы сделать массивы динамическими, но тоже возникает ошибка аксес виолейшен
Ответить с цитированием