Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
7-68086
Song
2003-05-06 08:40
2003.07.21
Печать на рулон


1-67907
adogg
2003-07-08 12:42
2003.07.21
StringGrid and Button


14-68015
Andryk
2003-07-04 14:20
2003.07.21
Просто флешка


3-67674
Пубертанец
2003-06-26 12:25
2003.07.21
Как в SQL-запросе писать в Мемо-поле (INSERT INTO ...)?


6-67946
Fixxxer
2003-05-12 00:37
2003.07.21
Socket





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский