Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.07.21;
Скачать: CL | DM;

Вниз

Анализ байтов, содержащихся в файле   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.017 c
1-67859
race1
2003-07-07 16:07
2003.07.21
memory $ dynamic array


1-67910
VVV
2003-07-08 15:42
2003.07.21
(D6) Ошибка компиляции


1-67802
Rel_
2003-07-09 13:17
2003.07.21
HexToBin


1-67908
iXuSs
2003-07-08 14:57
2003.07.21
Открыть все модули проекта.


14-68021
Катя Лель
2003-07-03 21:07
2003.07.21
Как открыть бутылку Гжелки?