var
F: file;
NumRead, i: Integer;
Buf: array[1..16] of Byte;
str: string;
begin
AssignFile(F, 'c:\1.exe');
Reset(F, 1);
repeat
BlockRead(F, Buf, SizeOf(Buf), NumRead);
str := '';
for i := 1 to NumRead do
str := str + Format('%2.2X ', [Buf]);
if str <> '' then Memo1.Lines.Add(str);
until (NumRead = 0);
CloseFile(F);
end;
Чтение больших файлов
Всем спасибо за поодержку,SNAKE
Шрифт для Memo нужно установить в Courier.
Зачем в Memo загружать exe'шник?? Если нужно обработать большой файл, то читаем Рихтера и "проецирование файлов в память".
Код:
var List: TStringList;
...
List.LoadFromFile (Имя_Файла);
...
List.LoadFromFile (Имя_Файла);
Проблема в непосредственно в компоненте Memo. Дело в том, что если в Strings загрузить файл больше сотни-другой килобайт, то вывод его на экран произойдёт полностью, вне зависимости от размера компонента. Как следствие - полный затуп программы и 99% загрузка системы.
Хотя чтение нетекстовых файлов лучше производить вручную, потому что в них могут встречаться символы '\0' - соответственно, функции для обработки текста данные после этого символа проигнорируют :(
Код:
var List: TStringList;
...
List.LoadFromFile (Имя_Файла);
...
List.LoadFromFile (Имя_Файла);
[/QUOTE]Tолько текстовые файлы. При загрузке бинарных файлов, данные загружаются до появления первого нулевого символа.
В exe модулях этот символ является четвертым.
И зачем нужно повторять вышесказанное?
Причем здесь TStrings.LoadFromFile() к бинарному файлу?
Как раз его не можно применить в данном случае. А если не
можно применить, тогда для чего вспоминать?
И проблема не в memo компоненте, так как в данном случае он не может загрузить пару сотню килобайт из exe модуля.
А если идет речь о текстовых файлах, и задержка при чтении
существена, то сперва можно считать данные в один TStringList. И после загрузки
Memo1.Lines.Assign(stringlist);
Цитата:
И проблема не в memo компоненте
и в нём тоже.... просто так отобразить нифига не получиться....
для того штоб отоброзить exe
1. читаем его в какойнибудь буффер (используем File или Stream)
2. все байты, которые будут выводить побочные символы (00h, 08h, 0Ah, 0Dh и многое другое) меняем на чёнибудь другое (пробел, точка или на чё там захотите)
3. грузим преобразованные данные в memo
но и здесь я чёто сомневаюсь что всё загрузится... вроде бы гдето встречал описалово, в котором сказано, что в memo при начальных установках можно загрузить тока 64Кб
для того штоб отоброзить exe
1. читаем его в какойнибудь буффер (используем File или Stream)
2. все байты, которые будут выводить побочные символы (00h, 08h, 0Ah, 0Dh и многое другое) меняем на чёнибудь другое (пробел, точка или на чё там захотите)
3. грузим преобразованные данные в memo
но и здесь я чёто сомневаюсь что всё загрузится... вроде бы гдето встречал описалово, в котором сказано, что в memo при начальных установках можно загрузить тока 64Кб[/QUOTE]Кодом выше, которого ты видимо не заметил, иначе не писал бы свой алгоритм, загрузил один почти 10Мб rar файл в мемо. Так что 64 кБ это что-то другое.
Кроме этого
Код:
procedure TForm1.Button9Click(Sender: TObject);
var
s1, s2, s3, s4: AnsiString;
i: Integer;
begin
s1 := '';s2 := '';s3 := '';s4 := '';
for i := 1 to 46 do begin
s1 := s1 + Chr(i);
s2 := s2 + Chr(127+i);
s3 := s3 + Chr(163+i);
s4 := s4 + Chr(209+i);
end ;
Memo1.Lines.Add(s1);
Memo1.Lines.Add(s2);
Memo1.Lines.Add(s3);
Memo1.Lines.Add(s4);
end;
var
s1, s2, s3, s4: AnsiString;
i: Integer;
begin
s1 := '';s2 := '';s3 := '';s4 := '';
for i := 1 to 46 do begin
s1 := s1 + Chr(i);
s2 := s2 + Chr(127+i);
s3 := s3 + Chr(163+i);
s4 := s4 + Chr(209+i);
end ;
Memo1.Lines.Add(s1);
Memo1.Lines.Add(s2);
Memo1.Lines.Add(s3);
Memo1.Lines.Add(s4);
end;
[/QUOTE]
Скока-скока :eek: ???
Во-первых, загрузить файл в сам MEMO невозможно - для хранения файла используется отдельный объект, производный от TStrings, который является одним из полей класса TMemo. В нём и реализуется загрузка.
Во-вторых, не знаю, как именно реализуется хранение строк, но загрузить в TStrings можно что угодно. Ввод информации, считанной через поток, в список производится через свойство Text - соответственно, ограничивается только допустимой длиной строки и наличием нулевого символа.
Но ограничение на размер отображаемой информации существует. Просто после определённого размера (точно не скажу), время перерисовки компонента стремится к бесконечности.
Можете поэкспериментировать на программе Notepad - тот же самый Memo.
Цитата:
И строки нормально выводились
не могли они нормально выводиться... если конечно все байты не представляли строковые данные.... элементарный пример....
Код:
var
S: String;
begin
S := '1'#9'2'#13#10'3'#0'456';
Memo1.Lines.Add(s);
S: String;
begin
S := '1'#9'2'#13#10'3'#0'456';
Memo1.Lines.Add(s);
в строке - 10 символов... причём вместо #9 memo вставляет знак табуляции, #13#10 интерпритирует как перевод строки и возврат каретки, а #0 как конец строки..... суть алгоритма, который я привёл - заменить побочные символы на нормальные, а не в 64кб.... учитесь улавливать суть!!!
[QUOTE=verybadbug]суть алгоритма, который я привёл - заменить побочные символы на нормальные, а не в 64кб.... учитесь улавливать суть!!![/QUOTE]Хорошо, будем учиться. Значит "суть алгоритма, который я привёл - заменить побочные символы на нормальные" была суть, а[QUOTE=verybadbug]но и здесь я чёто сомневаюсь что всё загрузится... вроде бы гдето встречал описалово, в котором сказано, что в memo при начальных установках можно загрузить тока 64Кб[/quote] была лапша? :)
это зы )))
Данные в виде файла в двоичном виде, размеры файлов ~100-200 Мегов и меньше (от 10к).
Создаю поток чтения из файла, размещаю данные в массивах, любые конвертации и вычисления можно "на лету", можно после закрытия файла. Форматы цифирь int и double(сразу во float для последующей
производительности). Проблема в том, что необходимо просмотреть эти данные. Использовал контролы ListBox, RichTextBox, ListView и даже DataGridView. Все, кроме DataGridView, требуют string формата. При загрузке небольших файлов (до 30М) проблем нет, но с большими файлами это либо очень долго либо комп вообще зависает. С DataGridView еще больше тормозит и при заполнении таблицы данными объем таблицы раздувается как на дрожжах. Как вывести эти данные на контрол? Может какую-нибудь буферизацию потока MemoryStream
организовать? Но как это сделать не знаю. Частями не хотелось бы, скролить надо весь файл сразу.
Цитата: alexsin
Помогите решить проблему отображения больших массивов цифровых данных. (C#)
Создайте отдельную тему в соответствующем разделе (Microsoft .NET).