Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Чтение\запись нетипизированного файла, Только не отсылайте к FAQ. 
:(
    Опции темы
Limonadni Joe
Дата 31.7.2003, 20:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 311
Регистрация: 1.11.2002
Где: Москва

Репутация: нет
Всего: 2



Признаюсь, самому разбираться лень, да и некогда. Спрашиваю тех, кто уже набил на этом руку.

Итак, файл состоит из одной структуры TType1 в самом начале файла, а дальше идёт неопределенное количество структур TType2. Всё это надо загнать (или выгнать из smile.gif) в переменную и дин. массив соответственно. Прошу код wink.gif.
PM MAIL ICQ YIM MSN   Вверх
December
Дата 1.8.2003, 02:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Antitheorist
****


Профиль
Группа: Участник
Сообщений: 4423
Регистрация: 14.8.2002
Где: Харьков

Репутация: 8
Всего: 57



Код? Без структуры код невозможен, но если тебе лень разбираться в хэлпах то придётся не лениться разбираться в чужих примерах!
Ладно, вот один из моих методов, думаю, его можно назвать универсальным.
Код

type
 TSpectraHeader = record
                        SpType: integer;//1-UV, 2-IR
               StartWaveNumber: single;
                      WaveStep: single;
                 EndWaveNumber: single;
                        ZeroID: word;
                   ArrayLength: word;
                      Comments: string;
                      LastReal: single;
                  end;{record}
 TSpectra = array [1..2500] of single;

...

procedure LoadSpectra(gFileName:string;
               var gSpectraHeader:TSpectraHeader; var gSpectra:TSpectra);
var
 fileHandle:integer;
 wstr:string;
 wcharr:array[1..40]of char;
 i:integer;
begin
if not fileexists(gFileName) then
       if fileexists(gFileName+'.dtx') then gFileName:=gFileName+'.dtx'
       else
       begin
       showmessage('File not found!');
       exit;
       end;{no file!}
UpdateLoadedID(gFileName);
fileHandle:=fileOpen(gFileName,fmOpenRead);
if fileHandle=-1 then
     begin
     showmessage('Error opening the file "'+gFileName+'".');
     exit;
     end;{if can not open}
fileRead(fileHandle,wcharr,4);
wstr:='';
setlength(wstr,4);
with gSpectraHeader do
       begin
for i:=1 to 4 do wstr[i]:=wcharr[i];
if wstr='DTX0' then SpType:=1 else
if wstr='DTY0' then SpType:=2
              else showmessage('Incorrect file header!!!'+chr(13)+wstr);
if SpType=2 then showmessage('This spectra seems to be IR!');
fileRead(fileHandle,StartWaveNumber,4);
fileRead(fileHandle,WaveStep,4);
fileRead(fileHandle,EndWaveNumber,4);
fileRead(fileHandle,ZeroID,2);
fileRead(fileHandle,ArrayLength,2);
fileSeek(fileHandle,-40,2);
fileRead(fileHandle,wcharr,36);
setLength(wstr,ord(wcharr[1]));
for i:=2 to length(wstr)+1 do wstr[i-1]:=wcharr[i];
Comments:=wstr;
fileRead(fileHandle,LastReal,4);
       end;{with}
fileSeek(fileHandle,20,0);
for i:=1 to 2500 do gSpectra[i]:=0;
if fileRead(fileHandle,gSpectra,gSpectraHeader.ArrayLength*4)<>gSpectraHeader.ArrayLength*4
       then showmessage('Error reading the spectra!');
fileClose(fileHandle);
end;{LoadSpectra}


Тут грузится только одна структура из файла, но по окончании загрузки указатель оказывается в конце первой (то есть начале следующей), так что всё это можно прогонять в цикле вплоть до EOF.


--------------------
Для друзей с винграда - скидки на разработку сайтов
PM MAIL WWW ICQ   Вверх
Limonadni Joe
Дата 1.8.2003, 11:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 311
Регистрация: 1.11.2002
Где: Москва

Репутация: нет
Всего: 2



Похоже, лучше самому smile.gif.

А может можно как-то через FileStream? В один FS загнать определённое количество байтов из файла (т.е. перевую структуру), а в другой остальную часть файла. Потом читать из них, как из типизированных файлов. Бред я говорю или такое действительно возможно?
PM MAIL ICQ YIM MSN   Вверх
December
Дата 1.8.2003, 13:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Antitheorist
****


Профиль
Группа: Участник
Сообщений: 4423
Регистрация: 14.8.2002
Где: Харьков

Репутация: 8
Всего: 57



Мне почему-то кажется, что мой вариант - один из самых простых. Тебе по-любому придётся считывать некоторое количество байт и трансформировать их в переменную нужного типа, а делать это из файла напрямую или блока памяти, или потока - один геморрой. А если структура имеет члены переменной длины - то полный аминь. Так что лучше не вставлять всякие прокладки типа Stream.


--------------------
Для друзей с винграда - скидки на разработку сайтов
PM MAIL WWW ICQ   Вверх
p0s0l
Дата 1.8.2003, 18:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

Репутация: 58
Всего: 112



December - мог бы уж чо-нить поменьше привести в пример человеку...
Типа этого:
Код
var
 var1 : TType1; var2 : array of TType2;

procedure ReadData;
var
 f : file;
 size, i : integer;
begin
 AssignFile(f, 'abc.dat');
 Reset(f, 1);
 BlockRead(f, var1, sizeof(TType1));
 size := FileSize(f) - sizeof(TType1); // оставшаяся непрочитанная часть файла
 SetLength(var2, size div sizeof(TType2)); // длина дин. массива
 BlockRead(f, var2[0], size); // читаем все элементы махом
 CloseFile(f);
end;


Аналогично для записи.

Токо приведенный выше пример предпологает что TType1 и TType2 не содержат динамич. массивов или
динам. строк, ссылок на объекты... Иначе придется процедурину на целую страницу писать а то
и больше...



--------------------
С уважением, г-н Посол.
PM   Вверх
PostEr
Дата 1.8.2003, 19:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 282
Регистрация: 30.6.2003
Где: Самара

Репутация: нет
Всего: 1



Народ! А как мне например считать char[4], потом int, потом float, потом ещё какую фигню? Проблема в char[4] (array[0..3] of byte) - я читаю (например должно быть считано IBSP), f у меня получается: (тут какой-то каракуль)BSP. Читаю так:

var f:file;
magic:array[0..3] of byte;

begin

AssignFile(f,filename);
Reset(f,4); //Вот тут проблема - пробовал разные варианты sad.gif
BlockRead(f, magic, 1, sizeof(magic));

что не так? может кто-нибудь где-нибудь видел сорц чтения bsp карты из третьего квака под паскаль?


--------------------

------------------------------------------------------------------

[email protected]
До востребования

PM MAIL WWW ICQ   Вверх
December
Дата 1.8.2003, 20:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Antitheorist
****


Профиль
Группа: Участник
Сообщений: 4423
Регистрация: 14.8.2002
Где: Харьков

Репутация: 8
Всего: 57



PostEr Адрес для переменной magic должен быть magic[0] в данном случае.
BlockRead(f, magic[0], 1, sizeof(magic));


--------------------
Для друзей с винграда - скидки на разработку сайтов
PM MAIL WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1066 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.