|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
||||
|
||||
TStream и чтение из Buffer
Сразу к делу:
Код:
procedure EMNPGraph.LoadFromFile(const FileName: TFileName); var Stream : TStream; Size : Integer; Buffer: TBytes; begin Stream := TFileStream.Create(FileName, fmOpenRead or fmShareDenyWrite); try Size := Stream.Size - Stream.Position; SetLength(Buffer, Size); Stream.Read(Buffer, 0, Size); // что дальше необходимо делать с Buffer чтобы извлечь из него информацию finally Stream.Free; end; end; Файл, из которого считывается информация имеет следующий вид: Код:
2453 131 2454 137 2455 111 2456 120 2457 127 2458 148 Как грамотно импортировать данные в два "безразмерных массива"? Код:
X : array of longint; Y : array of longint; |
#2
|
|||
|
|||
Лучше тут FileStream не использовать.
читай либо через TStringList, либо через стандартные паскалевские файловые операции. |
#3
|
||||
|
||||
Цитата:
Причина такого "лучше"? У меня файл на от 11к до 65к каналов (т.е. строк) |
#4
|
||||
|
||||
Сложность реализации и отсутствие гибкости.
— Как тебя понимать? — Понимать меня не обязательно. Обязательно меня любить и кормить вовремя. На Delphi, увы, больше не программирую. Рекомендуемая литература по программированию |
#5
|
||||
|
||||
Цитата:
на 22к стандартным while not EoF(graphFile) do потрачено 98 секунд. Это никуда не годится. И всё же?... |
#6
|
||||
|
||||
Проще всего через TStringList. Он сам разнесет на список строк. Сразу же получаешь размер результирующих массивов, выделяешь, в первый кладешь все до пробелов (через POS), во второй - все после. Если вначале есть пробелы - можно вылечить через trim. Или просто поискать первый не пробел.
jmp $ ; Happy End! The Cake Is A Lie. |
Этот пользователь сказал Спасибо Bargest за это полезное сообщение: | ||
Uniq! (05.03.2013)
|
#7
|
||||
|
||||
Цитата:
98 секунд повторюсь. Очень долго. |
#8
|
||||
|
||||
Код приведи. Не может там быть 98 секунд.
jmp $ ; Happy End! The Cake Is A Lie. |
#9
|
||||
|
||||
Код:
procedure EMNPGraph.LoadFromFile(const FileName: TFileName); var tFile : TextFile; tmp : string; begin AssignFile(tFile,FileName); Reset(tFile); while not EoF(tFile) do begin SetLength(gX,length(gX)+1); SetLength(gY,length(gY)+1); ReadLn(tFile,tmp); tmp:=trim(tmp); gX[length(gX)-1] := StrToInt(Copy(tmp,0,Pos(' ',tmp)-1)); Delete(tmp,1,Pos(' ',tmp)-1); gY[length(gY)-1] := StrToInt(Trim(tmp)); end; CloseFile(tFile); gLength := length(gX)-1; end; |
#10
|
||||
|
||||
Весь косяк, думаю, в постоянной релокации массивов. Это очень долго. Ну и чтение по строчкам (22 тысячи отдельных обращений к диску вместо пары-тройки) тоже вносят свою лепту.
Вот так Код:
st := TStringList.Create(); st.LoadFromFile('123.txt'); GetMem(tar1, st.Count * sizeof(integer)); GetMem(tar2, st.Count * sizeof(integer)); for i := 0 to st.Count-1 do begin s := st.Strings[i]; j := Pos(' ', s); k := length(s); while s[k] <> ' ' do dec(k); tar1[i] := StrToInt(copy(s, 1, j - 1)); tar2[i] := StrToInt(copy(s, k + 1, length(s) - k)); end; Writeln('Fin!'); Readln; ЗЫЖ не обращай внимания на getmem, это еще с древних времен. PascalSchool так сказать. Юзай SetLength. jmp $ ; Happy End! The Cake Is A Lie. Последний раз редактировалось Bargest, 05.03.2013 в 22:11. |
Этот пользователь сказал Спасибо Bargest за это полезное сообщение: | ||
Uniq! (05.03.2013)
|
#11
|
||||
|
||||
Можно и так
Код:
function ppp(ds: string): string; var f: file of byte; text: pchar; begin AssignFile(f, ds); Reset(f); GetMem(text, 53 {сколько нужно}); BlockRead(f, text^, 53); SetLength(Result, 53); Result:= string(text); CloseFile(f); end; Я не понял Вашего вопроса, но всё же Вам на него отвечу! Последний раз редактировалось Alegun, 05.03.2013 в 22:41. |
Этот пользователь сказал Спасибо Alegun за это полезное сообщение: | ||
Uniq! (05.03.2013)
|
#12
|
||||
|
||||
Вот сижу и думаю: уже говорить "как дети" или еще подождем решения?
Некоторые программисты настолько ленивы, что сразу пишут рабочий код. Если вас наказали ни за что - радуйтесь: вы ни в чем не виноваты. |
#13
|
|||
|
|||
по поводу самого первого сабжа
Код:
procedure EMNPGraph.LoadFromFile(const FileName: TFileName); var Stream : TStream; Size : Integer; Buffer: Array of bytes;//<<==-- раз begin Stream := TFileStream.Create(FileName, fmOpenRead or fmShareDenyWrite); try Size := Stream.Size - Stream.Position; SetLength(Buffer, Size); Stream.Read(Buffer[0], 0, Size); //<<==--- именно так // затем делайте что угодно finally Stream.Free; end; end; И вообще - когда у функции имеется нетипизированный var или const параметр, а передают массив - то лучше всегда указывать не массив, а первый элемент массива. В случае статического массива это одно и то же, а в случае динамического - две большие разницы |