Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2012.03.25;
Скачать: [xml.tar.bz2];

Вниз

Использование TFileStream для текста и бинарного файла   Найти похожие ветки 

 
mnj   (2011-12-06 01:29) [0]

Товарищи, есть задача: нужно читать разные варианты грида из программы Surfer: текстовый и два варианта бинарных.


 
KilkennyCat ©   (2011-12-06 01:37) [1]

ну так читай. TFileStream форматонезависим.


 
mnj   (2011-12-06 01:38) [2]

Виноват, случайно отправил. Так вот: первые 4 байта есть заголовок для каждого типа (DSAA, DSBB, DSRB). Если я организую это через FileStream, как мне читать текстовый файл, если он представляет собой набор строк разной длины, заранее неизвестной (бинарные имеют строгий формат). Могу привести описание форматов при необходимости. Спасибо.


 
KilkennyCat ©   (2011-12-06 01:56) [3]

ну что-то типа:
var
 b : byte;
 s : string;
 header : string[4];
try
 Stream := TFileStream.Create("c:\test.dat", fmOpenRead);
 StreamLength := Stream.Size;
 Stream.ReadBuffer(header , sizeof(header)); // прочитали первые четыре байта
 while Stream.Pos < Stream.Size do bedin  // бежим, пока файл не кончится
   Stream.ReadBuffer(b, sizeof(b));
   if b = признак конца строки then begin
     (тут получили строку s, делаем с ней что нужно);
     s := "";
   end else s := s + chr(b);
 end;
except
    //обработка ошибки открытия файла
end;


 
KilkennyCat ©   (2011-12-06 01:58) [4]

да, еще незабыть Stream.Free; выполнить, когда он ненужен будет.


 
mnj   (2011-12-06 11:56) [5]

В том и фокус, что Read и ReadBuffer не дают полностью четыре символа сигнатуры - первый пропадает, вместо DSAA получаю SAA. Если побайтно читать и склеивать в строку, тогда получается правильно. Почему улетает первый символ?


 
Сергей М. ©   (2011-12-06 12:04) [6]


> Почему улетает первый символ?


Потому что первый символ при выводе трактуется счетчик символов в строке


 
Сергей М. ©   (2011-12-06 12:07) [7]

> DSAA, DSBB, DSRB

Сделай соответствующие даблворды из кодов этого хозяйства и читай из стрима не в string[4], а в даблворд и сравнивай с подготовленными даблвордами сигнатур


 
Плохиш ©   (2011-12-06 12:35) [8]


> mnj   (06.12.11 11:56) [5]

Типа программистом любая домохозяйка стать может. работа не пыльная и думать не надо, сиди дави кнопки и греби бабло.

 header = "1234";
 Stream.ReadBuffer(header[1] , 4); // вот теперь прочитали первые четыре байта и интерпретировали их так как надо.


 
mnj   (2011-12-06 14:44) [9]

Так тоже неплохо. Это одноразовая операция
var InFile: TFileStream;
B: byte;
I: integer;

.....
 for I:= 1 to 4 do
    begin
      InFile.Read(B,1);    //чтение сигнатуры, определяющей вид грида
      Id:= Id + char(B);
    end;
  if Id = "DSAA" then....


 
Ega23 ©   (2011-12-06 16:19) [10]


> Так тоже неплохо


const
ID1 : Cardinal = $ABCDEF01;
ID2 : Cardinal = $ABCDEF02;
ID3 : Cardinal = $ABCDEF03;
.....

var
 aHeader: Cardinal;
begin
 stream.ReadBuffer(aHeader, SizeOf(Cardinal));
 case aHeader of
   ID1: ....;
   ID2: ....;
   ID3: ....;
   .....
 end;
end;


И не надо заморачиваться с Ansi это или юникод, чар или не чар.


 
han_malign   (2011-12-06 17:37) [11]


> > Так тоже неплохо

- при некоторых условиях
type
   PDSFileContent = ^TDSFileContent;
   TDSFileContent = record
       case DSType: LongWord of
       $41415344: (text: array[0..max_size-1]of AnsiChar);
       $42425344: (bb: array[0..max_size div sizeof(TDSBBRecord)-1]of TDSBBREcord);
       $42525344: (rb: array[0..max_size div sizeof(TDSRBRecord)-1]of TDSRBREcord);
   end;
var dump: TMemoryStream;
    slDump: TStringList;
    nRecords, i: integer;
begin
   dump:= TMemoryStream.Create;
   try
   dump.LoadFromFile(DSFileName);
   with(PDSFileContent(dump.Memory))do
   if( dump.size > sizeof(DSType) )then begin
        case(DSType)of
        $41415344: begin
             slDump:= TStringList.Create;
             try
             dump.Position:= sizeof(DSType);
             slDump.LoadFromStream(dump);
             ...
             finally
                slDump.Free;
             end;
        end{DSAA};
        $42425344: begin
             nRecords:= (dump.Size - sizeof(DSType)) div sizeof(bb[0]);
             for i:= 0 to nRecords-1 do
                with(bb[i])do begin
                     ...
                end;
        end{DSBB};
        $42525344: begin
             nRecords:= (dump.Size - sizeof(DSType)) div sizeof(rb[0]);
             for i:= 0 to nRecords-1 do
                with(rb[i])do begin
                     ...
                end;
        end{DSRB};
        end{case(DSType)};
   end;
   fynally
      dump.Free;
   end;
end;

- max_size - влияет только на то - сколько элементов отладчик покажет...


 
han_malign   (2011-12-06 17:38) [12]

with(PDSFileContent(dump.Memory)^)do


 
mnj   (2011-12-07 13:45) [13]

спасибо всем - не ожидал дискуссии. уже все сделал



Страницы: 1 вся ветка

Форум: "Начинающим";
Текущий архив: 2012.03.25;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.003 c
15-1307176521
Inovet
2011-06-04 12:35
2012.03.25
Некоммерческое кино


1-1289764904
Константин
2010-11-14 23:01
2012.03.25
Больше 9 com портов...


2-1323374485
Gu
2011-12-09 00:01
2012.03.25
Openfolder


2-1323635690
Bobermaner
2011-12-12 00:34
2012.03.25
Работа с COM-портом.


15-1322323268
upc
2011-11-26 20:01
2012.03.25
Название стен при виде сверху





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский