|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
||||
|
||||
Работа с большим текстовым файлом
Есть txtшник. Прога черпает из него нужный текст. Если текст в начале файла всё идёт гладко. Если текст в середине или в конце, то прога зависает, проц и озу забиваются на 100% (судя по гаджетам на windows sidebar).
Вот код: Код:
procedure TForm1.Button2Click(Sender: TObject); var StrLst:TStringList; s,s1:AnsiString; i:byte; begin if not FileExists('1.txt') then MessageDlg('Файл не найден',mtError,[mbOk],0) else begin StrLst:=TStringlist.Create; StrLst.LoadFromFile('1.txt'); s1:=Label1.Caption; delete(s1,1,14); s:=(''); i:=0; while i<StrLst.Count-1 do if StrLst[i]='Г'+s1 then begin repeat inc(i); s:=s+StrLst[i]; s:=s+#13#10; if i=StrLst.Count-1 then break; until(StrLst[i+1]='Г'+IntToStr(StrToInt(s1)+1)); break; end else inc(i); ShowMessage(s); end; end; Поможет ли это? Может быть, я и левша, но я всегда прав! |
#2
|
||||
|
||||
Цитата:
Цитата:
Цитата:
И где освобождение объекта StrLst!? |
#3
|
|||
|
|||
Работать с большими текстовыми файлами лучше через stream (загрузка файла). При парсенге лучше использовать copy, pos
|
#4
|
||||
|
||||
стрим стриму рознь.
— Как тебя понимать? — Понимать меня не обязательно. Обязательно меня любить и кормить вовремя. На Delphi, увы, больше не программирую. Рекомендуемая литература по программированию |
#5
|
||||
|
||||
Цитата:
Освобождение не требуется потому, что, возможно, на кнопку будут нажимать не один раз. А по закрытии всей проги память итак освободится. Цитата:
Может быть, я и левша, но я всегда прав! |
#6
|
||||
|
||||
Цитата:
Цитата:
Цитата:
|
#7
|
||||
|
||||
Цитата:
Цитата:
Может быть, я и левша, но я всегда прав! Последний раз редактировалось R-18Rus, 12.08.2012 в 16:15. |
#8
|
||||
|
||||
Цитата:
Цитата:
|
#9
|
||||
|
||||
Сам файл не виноват. Вы видимо что-то недопонимаете. Файл один, весит 68 kb, 822 строки.
Может быть, я и левша, но я всегда прав! Последний раз редактировалось R-18Rus, 12.08.2012 в 16:29. |
#10
|
||||
|
||||
Цитата:
Код:
var i:byte; Не нужно экономить на переменной цикла, всегда (ну почти всегда) пиши: Код:
i: Integer; |
Этот пользователь сказал Спасибо poli-smen за это полезное сообщение: | ||
R-18Rus (12.08.2012)
|
#11
|
||||
|
||||
А что значит вот это:
Код:
... s:=(''); ... Да, и всё же поменяй Код:
... s:=s+StrLst[i]; s:=s+#13#10; ... Код:
s:=s+StrLst[i]+#13#10; Я не понял Вашего вопроса, но всё же Вам на него отвечу! |
#12
|
||||
|
||||
Это реально была ошибка типа данных. Но почему же не было никаких warningov и errov типа выход за границы диапозона типа byte?
Может быть, я и левша, но я всегда прав! |
#13
|
||||
|
||||
Цитата:
Может быть, я и левша, но я всегда прав! |
#14
|
||||
|
||||
Я про скобки, строка обычно обнуляется так: s:='';
Я не понял Вашего вопроса, но всё же Вам на него отвечу! |
#15
|
||||
|
||||
Ну скобки это уже личная отсебятина.
Может быть, я и левша, но я всегда прав! |