Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Чтение больших файлов

330
14 октября 2006 года
kastron
215 / / 17.09.2006
Как в компонент корректно memo1 прочитать файл 1.exe(он весит где-то 500 KB?Я пробовал с мемо глюки полные он большие файлы полностью не загржает.Если это с мемо сделать невозможно,подскажите пожалуйста другое решение этого вопроса.
Всем спасибо за поодержку,SNAKE
4
14 октября 2006 года
mike
3.7K / / 01.10.2002
Можно считывать по частям. Вообще не понимаю зачем EXE загружать в Memo.

Расскажи про задачу подробнее.

Есть великолепные функции ANSI C - fopen, fread, fwrite, feof, fclose
3.0K
14 октября 2006 года
Мerlin
267 / / 25.07.2006
Шрифт для Memo нужно установить в Courier.
Wordwrap = false,
Scrollbars = ssVertical (или ssBoth)
Код:
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;
497
15 октября 2006 года
IL84
267 / / 24.04.2003
Зачем в Memo загружать exe'шник?? Если нужно обработать большой файл, то читаем Рихтера и "проецирование файлов в память".
309
16 октября 2006 года
el scorpio
1.1K / / 19.09.2006
На самом деле, через объекты типа TStringList (класс, производный от TStrings) можно загружать файлы гораздо большего размера за доли секунды. И решение этого простое, как апельсин. :)
 
Код:
var List: TStringList;
...
List.LoadFromFile (Имя_Файла);


Проблема в непосредственно в компоненте Memo. Дело в том, что если в Strings загрузить файл больше сотни-другой килобайт, то вывод его на экран произойдёт полностью, вне зависимости от размера компонента. Как следствие - полный затуп программы и 99% загрузка системы.

Хотя чтение нетекстовых файлов лучше производить вручную, потому что в них могут встречаться символы '\0' - соответственно, функции для обработки текста данные после этого символа проигнорируют :(
3.0K
16 октября 2006 года
Мerlin
267 / / 25.07.2006
[QUOTE=el scorpio]На самом деле, через объекты типа TStringList (класс, производный от TStrings) можно загружать файлы гораздо большего размера за доли секунды. И решение этого простое, как апельсин. :)
 
Код:
var List: TStringList;
...
List.LoadFromFile (Имя_Файла);

[/QUOTE]Tолько текстовые файлы. При загрузке бинарных файлов, данные загружаются до появления первого нулевого символа.
В exe модулях этот символ является четвертым.
309
16 октября 2006 года
el scorpio
1.1K / / 19.09.2006
Merlin
И зачем нужно повторять вышесказанное?
3.0K
16 октября 2006 года
Мerlin
267 / / 25.07.2006
Ты просто столько воды налил, что не виден был смысл твоего ответа.

Причем здесь TStrings.LoadFromFile() к бинарному файлу?
Как раз его не можно применить в данном случае. А если не
можно применить, тогда для чего вспоминать?

И проблема не в memo компоненте, так как в данном случае он не может загрузить пару сотню килобайт из exe модуля.

А если идет речь о текстовых файлах, и задержка при чтении
существена, то сперва можно считать данные в один TStringList. И после загрузки
Memo1.Lines.Assign(stringlist);
339
18 октября 2006 года
verybadbug
619 / / 12.09.2005
Цитата:
И проблема не в memo компоненте


и в нём тоже.... просто так отобразить нифига не получиться....
для того штоб отоброзить exe
1. читаем его в какойнибудь буффер (используем File или Stream)
2. все байты, которые будут выводить побочные символы (00h, 08h, 0Ah, 0Dh и многое другое) меняем на чёнибудь другое (пробел, точка или на чё там захотите)
3. грузим преобразованные данные в memo

но и здесь я чёто сомневаюсь что всё загрузится... вроде бы гдето встречал описалово, в котором сказано, что в memo при начальных установках можно загрузить тока 64Кб

3.0K
18 октября 2006 года
Мerlin
267 / / 25.07.2006
[QUOTE=verybadbug]и в нём тоже.... просто так отобразить нифига не получиться....
для того штоб отоброзить 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;
И строки нормально выводились, только в начале первой строки было несколько Б подобных букв. Так что, если строки сформированы, то мемо их выводит. Но из-за нулей в exe модуле строки небыли сформированы.
309
18 октября 2006 года
el scorpio
1.1K / / 19.09.2006
[QUOTE=Мerlin]Кодом выше, которого ты видимо не заметил, иначе не писал бы свой алгоритм, загрузил один почти 10Мб rar файл в мемо. Так что 64 кБ это что-то другое.
[/QUOTE]
Скока-скока :eek: ???
Во-первых, загрузить файл в сам MEMO невозможно - для хранения файла используется отдельный объект, производный от TStrings, который является одним из полей класса TMemo. В нём и реализуется загрузка.
Во-вторых, не знаю, как именно реализуется хранение строк, но загрузить в TStrings можно что угодно. Ввод информации, считанной через поток, в список производится через свойство Text - соответственно, ограничивается только допустимой длиной строки и наличием нулевого символа.
Но ограничение на размер отображаемой информации существует. Просто после определённого размера (точно не скажу), время перерисовки компонента стремится к бесконечности.
Можете поэкспериментировать на программе Notepad - тот же самый Memo.
339
18 октября 2006 года
verybadbug
619 / / 12.09.2005
Цитата:
И строки нормально выводились


не могли они нормально выводиться... если конечно все байты не представляли строковые данные.... элементарный пример....

 
Код:
var
  S: String;
begin
  S := '1'#9'2'#13#10'3'#0'456';
  Memo1.Lines.Add(s);

в строке - 10 символов... причём вместо #9 memo вставляет знак табуляции, #13#10 интерпритирует как перевод строки и возврат каретки, а #0 как конец строки..... суть алгоритма, который я привёл - заменить побочные символы на нормальные, а не в 64кб.... учитесь улавливать суть!!!
3.0K
18 октября 2006 года
Мerlin
267 / / 25.07.2006
[QUOTE=verybadbug]суть алгоритма, который я привёл - заменить побочные символы на нормальные, а не в 64кб.... учитесь улавливать суть!!![/QUOTE]Хорошо, будем учиться. Значит "суть алгоритма, который я привёл - заменить побочные символы на нормальные" была суть, а[QUOTE=verybadbug]но и здесь я чёто сомневаюсь что всё загрузится... вроде бы гдето встречал описалово, в котором сказано, что в memo при начальных установках можно загрузить тока 64Кб[/quote] была лапша? :)
339
20 октября 2006 года
verybadbug
619 / / 12.09.2005
это зы )))
56K
31 декабря 2009 года
alexsin
1 / / 31.12.2009
Помогите решить проблему отображения больших массивов цифровых данных. (C#)
Данные в виде файла в двоичном виде, размеры файлов ~100-200 Мегов и меньше (от 10к).
Создаю поток чтения из файла, размещаю данные в массивах, любые конвертации и вычисления можно "на лету", можно после закрытия файла. Форматы цифирь int и double(сразу во float для последующей
производительности). Проблема в том, что необходимо просмотреть эти данные. Использовал контролы ListBox, RichTextBox, ListView и даже DataGridView. Все, кроме DataGridView, требуют string формата. При загрузке небольших файлов (до 30М) проблем нет, но с большими файлами это либо очень долго либо комп вообще зависает. С DataGridView еще больше тормозит и при заполнении таблицы данными объем таблицы раздувается как на дрожжах. Как вывести эти данные на контрол? Может какую-нибудь буферизацию потока MemoryStream
организовать? Но как это сделать не знаю. Частями не хотелось бы, скролить надо весь файл сразу.
5
01 января 2010 года
hardcase
4.5K / / 09.08.2005
Цитата: alexsin
Помогите решить проблему отображения больших массивов цифровых данных. (C#)

Создайте отдельную тему в соответствующем разделе (Microsoft .NET).

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог