Форум: "Начинающим";
Текущий архив: 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