Форум: "Основная";
Текущий архив: 2003.07.21;
Скачать: [xml.tar.bz2];
Вниз
Анализ байтов, содержащихся в файле Найти похожие ветки
← →
Lime (2003-07-08 05:23) [0]А как бы сделать такую штуку, чтобы можно было посмотреть, сколько байтов того или иного значения содержится в файле? Проблема возникает 1) С побайтным чтением 2) С совместимостью типов integer и byte
var
Bar : array[0..255] of longint;
i : integer;
F : File;
TF: TextFile;
begin
if OpenDialog1.Execute then
begin
AssignFile(F, OpenDialog1.FileName);
ReSet(F);
for i:=0 to 255 do Bar[i]:=0;
for i:=0 to 255 do begin
BlockRead(F,Buffer,1) {при чтении, скажем, файла, сожержащего только один символ 1 выдает Read beyond the end of file, абыдна...};
if Buffer=i {вот тут какую функцию использовать?} then Inc(Bar[i]);
end;
end;
AssignFile(TF,"result.cnt");
ReWrite(TF);
for i:=0 to 255 do Writeln(TF,i," ",Bar[i]);
CloseFile(TF);
CloseFile(F);
end;
← →
Babay (2003-07-08 05:41) [1]var
i : Byte;
F : File of byte;
begin
if OpenDialog1.Execute then
begin
AssignFile(F, OpenDialog1.FileName);
Reset(F);
While not eof (F) do begin
read(f,i);
if i {чего-то там} then begin
end;
end;
CloseFile(F);
end;
end;
только это медленный способ если файлы большие то лучше через TFileStream.
← →
default (2003-07-08 05:48) [2]ReSet(F, 1);
← →
Radionov Alexey (2003-07-08 08:18) [3]По скорости имхо идеально подойдет MMF:
Вот пример для файлов размером<2Gb:
Procedure TForm1.Button1Click(Sender: TObject);
Const
FileName = "D:\1.prn";
OutFileName = "d:\1.out";
Type
TBytesArray = Array[0..maxint - 1] Of byte; // На самом деле такой огромный массив не понадобится. Сделано это лишь для удобства доступа (обеспечиваем доступ по индексу).
Var
BytesCount: Array[0..255] Of Integer; // Счетчики байтов
Bytes: ^TBytesArray; // Буфер, где будет жить исследуемый файл
fHandle, fmHandle: THandle; // Хэндлы для файла и его проекции в память
k: integer; // С помощью k бегаем по файлу и считаем байты
Begin
fHandle := CreateFile(FileName, Generic_read, 0, Nil, open_existing, 0, 0); // Открываем файл на чтение
If fHandle <> invalid_handle_value Then // Если открылся,то
Try
fmHandle := CreateFileMapping(fHandle, Nil, Page_readonly, 0, 0, Nil); // Делаем его проекцию в память
If fmHandle <> 0 Then // Если сделали, то
Try
Bytes := MapViewOfFile(fmHandle, file_map_read, 0, 0, 0); // Получаем адрес спроецированного файла
If bytes <> Nil Then // Если получили, то
Try // начинаем подсчет
fillchar(BytesCount, SizeOf(BytesCount), 0); // Готовим массив счетчиков
For k := 0 To GetFileSize(fHandle, Nil) - 1 Do
inc(BytesCount[Bytes[k]]); // Считаем байты
With TStringList.Create Do // И выводим результат в выходной файл
Try
For k := 0 To 255 Do
add(format("Value: %d, Count: %d", [k, BytesCount[k]]));
SaveToFile(OutFileName);
Finally // Все, что идет далее - "уборка мусора"
free
End;
Finally
UnmapViewOfFile(Bytes);
End;
Finally
closeHandle(fmHandle);
End;
Finally
closeHandle(fHandle);
End;
End;
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2003.07.21;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.006 c