работа с файлами большого размера

Общие вопросы: версии и диалекты, синтаксис языка, cтруктуры и типы данных (массивы, строки, списки...), обработка данных и т.д.
Ответить
Tonyy
Сообщения: 12
Зарегистрирован: 23 май 2010, 10:36

10 июн 2010, 15:35

[syntax='Delphi']
type
TH400 = record //описываем заголовок файла
b1,b2,b3:longint;
b4,..,b27:word;
end;
THeadTras = record //описываем заголовок одной трассы
b1,...................,b7:longint;
b8,...................,b11:word;
b12,.................,b19:longint;
b20,b21 :word;
b22,.................,b25:longint;
b26,.................,b71:word;
b72,.................,b79:longint;
b80,.................,b93:word;
end;
THTras = record //описываем трассу, что состоит из заголовка и массива данных
HeadTras:THeadTras;
Data: array[1..1000] of single;
end;
TFN = record // описываем ту часть файла, которая образует суть сейсмограммы и может повторятся несколько раз
Tras: array [1..161] 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, 3]:=INTtostr(swapdword(H400.b3));
s1.Cells[1, 4]:=INTtostr(swap(H400.b4));
................................................................
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.b8
s3.ColCount:=swap(H400.b4)+1;
f.Seek(340,soFromcurrent); //заголовок файла, который мы считываем //объемом 400 байт, а мы считали только 60, поэтому переводим курсор //на нужную позицию
// for index :=1 to 2 do begin

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,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;
dd:=dd[3-i];
dd[3-i]:=temp;
end;
s3.Cells[k,j]:=floattostr(buf); //каждой ячейке таблицы присваиваем соответсвующее значение выборки
fn.tras[k].Data[j]:=buf; // заменяем данные на свопированные
end; // for j
end; // for k
// seg[index]:=fn; //здесь хотелось бы прочитать второй fn, но что бы я для этого не делал результат - либо стек перегружен, либо аксес виолейшен :(
// end;
f.Free;
end;

end.
[/syntax]

помогите найти ошибку?!?!?!?!
Аватара пользователя
Игорь Акопян
Сообщения: 1419
Зарегистрирован: 13 окт 2004, 17:11
Откуда: СПБ
Контактная информация:

11 июн 2010, 15:03

если диалог не Execute - ошибка будет на первом f.seek - надо всё в begin-end заключать
и в какой момент происходит ошибка? при присваивании fn в seg? или позже?
Изображение
Tonyy
Сообщения: 12
Зарегистрирован: 23 май 2010, 10:36

11 июн 2010, 16:24

раньше ошибка возникала сразу же при нажатии на кнопку. писала stack overlow. теперь проверку наличия файла сделал в begin - end'e . ошибка теперь возникает когда файл выбираю и нажимаю - открыть.
Аватара пользователя
Игорь Акопян
Сообщения: 1419
Зарегистрирован: 13 окт 2004, 17:11
Откуда: СПБ
Контактная информация:

17 июн 2010, 15:40

эээ... а по шагам если пройти в отладчике? поконкретнее, тскть
Изображение
wenatopolyqw
Сообщения: 0
Зарегистрирован: 23 окт 2012, 15:06

23 окт 2012, 23:49

wenatopolyqw
Сообщения: 0
Зарегистрирован: 23 окт 2012, 15:06

23 окт 2012, 23:53

Ответить