Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #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.
подскажите как исправить ошибку. еще надо бы сделать массивы динамическими, но тоже возникает ошибка аксес виолейшен
Ответить с цитированием
  #2  
Старый 04.06.2010, 04:56
Аватар для Aristarh Dark
Aristarh Dark Aristarh Dark вне форума
Модератор
 
Регистрация: 07.10.2005
Адрес: Москва
Сообщения: 2,907
Версия Delphi: Delphi XE
Репутация: выкл
По умолчанию

Нельзя так работать с динамичискими массивами, копируй область памяти.
__________________
Некоторые программисты настолько ленивы, что сразу пишут рабочий код.

Если вас наказали ни за что - радуйтесь: вы ни в чем не виноваты.
Ответить с цитированием
  #3  
Старый 04.06.2010, 05:12
Tonyy Tonyy вне форума
Новичок
 
Регистрация: 05.04.2010
Сообщения: 85
Репутация: 10
По умолчанию

но я пока с ними не работаю. а что значит копировать область памяти?
Ответить с цитированием
  #4  
Старый 04.06.2010, 06:50
Аватар для Aristarh Dark
Aristarh Dark Aristarh Dark вне форума
Модератор
 
Регистрация: 07.10.2005
Адрес: Москва
Сообщения: 2,907
Версия Delphi: Delphi XE
Репутация: выкл
По умолчанию

Цитата:
Сообщение от Help
Move procedure
Delphi syntax:
procedure Move(const Source; var Dest; Count: Integer);
Description
Move copies Count bytes from Source to Dest. No range checking is performed. Move compensates for overlaps between the source and destination blocks.
Whenever possible, use the global SizeOf function (Delphi) or the sizeof operator (C++) to determine the count.
примерно так
__________________
Некоторые программисты настолько ленивы, что сразу пишут рабочий код.

Если вас наказали ни за что - радуйтесь: вы ни в чем не виноваты.
Ответить с цитированием
  #5  
Старый 04.06.2010, 20:52
Tonyy Tonyy вне форума
Новичок
 
Регистрация: 05.04.2010
Сообщения: 85
Репутация: 10
По умолчанию

а как это применить к моему коду? я не совсем понимаю. может есть литература на эту тему, посоветуйте.
Ответить с цитированием
  #6  
Старый 04.06.2010, 21:36
Аватар для Aristarh Dark
Aristarh Dark Aristarh Dark вне форума
Модератор
 
Регистрация: 07.10.2005
Адрес: Москва
Сообщения: 2,907
Версия Delphi: Delphi XE
Репутация: выкл
По умолчанию

Я литературы не знаю, но ябы твой файл читал потоком и заполнял из него структуры. А дальше все как по маслу.

ЗЫЖ а действительно record, а не packed record?
__________________
Некоторые программисты настолько ленивы, что сразу пишут рабочий код.

Если вас наказали ни за что - радуйтесь: вы ни в чем не виноваты.
Ответить с цитированием
  #7  
Старый 04.06.2010, 21:45
Tonyy Tonyy вне форума
Новичок
 
Регистрация: 05.04.2010
Сообщения: 85
Репутация: 10
По умолчанию

а я разве не так делаю?
я что-то читал про классы, которые могут хранить списки структур. не знаю относится это к моему случаю или нет.
Ответить с цитированием
  #8  
Старый 04.06.2010, 21:59
Аватар для Aristarh Dark
Aristarh Dark Aristarh Dark вне форума
Модератор
 
Регистрация: 07.10.2005
Адрес: Москва
Сообщения: 2,907
Версия Delphi: Delphi XE
Репутация: выкл
По умолчанию

Я тчто-то читал про изготовление деталей порошковым методом, но я не знаю как, а порошок у меня есть, подскажите... а...?
__________________
Некоторые программисты настолько ленивы, что сразу пишут рабочий код.

Если вас наказали ни за что - радуйтесь: вы ни в чем не виноваты.
Ответить с цитированием
  #9  
Старый 04.06.2010, 23:33
Tonyy Tonyy вне форума
Новичок
 
Регистрация: 05.04.2010
Сообщения: 85
Репутация: 10
По умолчанию

офигеть шутка, смеялся пол часа. а по существу есть что сказать?
Ответить с цитированием
  #10  
Старый 04.06.2010, 23:39
Аватар для Aristarh Dark
Aristarh Dark Aristarh Dark вне форума
Модератор
 
Регистрация: 07.10.2005
Адрес: Москва
Сообщения: 2,907
Версия Delphi: Delphi XE
Репутация: выкл
По умолчанию

Просто же, кто создает файл - это для начала, а то у тебя слишком страшные структуры... Если сам - то зачем такое, если не сам - то протокол покажи. Реально интересная задача, но зачем ты ее через ж№;% решаешь?
__________________
Некоторые программисты настолько ленивы, что сразу пишут рабочий код.

Если вас наказали ни за что - радуйтесь: вы ни в чем не виноваты.
Ответить с цитированием
  #11  
Старый 05.06.2010, 00:13
Tonyy Tonyy вне форума
Новичок
 
Регистрация: 05.04.2010
Сообщения: 85
Репутация: 10
По умолчанию

если в двух словах то файл формата segY состоит из: текстового заголовка 3200 байт в формате EBCDIC, затем идет заголовок файла 400байт в котором хранится или может хранится полезная инфа о файле, данных, формате данных, затем идет заголовок трассы и после него данные трассы, затем снова заголовок второй трассы, затем данные второй трассы. итд. набор этих трасс составляют сейсмограмму. одна сейсмограмма состоит из конечного числа трасс. в моем случае из 161 трассы. в файле нет никакого разделения на сейсмограммы. т.е если в файле записаны две сейсмограммы, то там просто будут записаны 322 трассы. я хочу прочитывать этот файл и разделять данные на соответствующие сейсмограммы. таких сейсмограмм в файле может быть порядка 500-1000. т.е 161000трасс. и каждая имеет свой заголовок и данные. трасса - это зарегистрированные колебания во времени
Ответить с цитированием
  #12  
Старый 05.06.2010, 00:35
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,087
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Вообще, есть подозрение, что где-то в заголовках есть информация о кол-ве сейсмограмм и трасс, либо просто длинна данных. Соответсвенно, тебе надо считать соотв. заголовок и посмотреть внутри него нужные значения. Это раз.
Два. Для разных коллекций объектов существуют разные списки: TList (если у тебя указатели)? TObjectList (если данные у тебя представлены объектами), TCollection (ну тут тоже объекты и, наверное, тебе это уже не надо - там идет кастомизация типа объекта + нужные методы для среды Дельфей).
Ответить с цитированием
  #13  
Старый 05.06.2010, 00:50
Tonyy Tonyy вне форума
Новичок
 
Регистрация: 05.04.2010
Сообщения: 85
Репутация: 10
По умолчанию

совершенно правильные подозрения. эти данные я и считываю из заголовков. и прочитать первую сейсмограмму т.е набор из 161 трассы не представляет сложностей. они возникают если я пытаюсь прочитать вторую сейсмограмму, т. е второй набор из 161 трассы
Ответить с цитированием
  #14  
Старый 06.06.2010, 08:52
Tonyy Tonyy вне форума
Новичок
 
Регистрация: 05.04.2010
Сообщения: 85
Репутация: 10
По умолчанию

а что означает конверт со стрелочкой
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 08:00.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025