![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
||||
|
||||
|
Сразу к делу:
Код:
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
|
||||
|
||||
|
Сложность реализации и отсутствие гибкости.
|
|
#5
|
||||
|
||||
|
Цитата:
на 22к стандартным while not EoF(graphFile) do потрачено 98 секунд. Это никуда не годится. И всё же?... ![]() |
|
#6
|
||||
|
||||
|
Проще всего через TStringList. Он сам разнесет на список строк. Сразу же получаешь размер результирующих массивов, выделяешь, в первый кладешь все до пробелов (через POS), во второй - все после. Если вначале есть пробелы - можно вылечить через trim. Или просто поискать первый не пробел.
|
| Этот пользователь сказал Спасибо Bargest за это полезное сообщение: | ||
Uniq! (05.03.2013)
| ||
|
#7
|
||||
|
||||
|
Цитата:
98 секунд повторюсь. Очень долго. |
|
#8
|
||||
|
||||
|
Код приведи. Не может там быть 98 секунд.
|
|
#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. Последний раз редактировалось 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 параметр, а передают массив - то лучше всегда указывать не массив, а первый элемент массива. В случае статического массива это одно и то же, а в случае динамического - две большие разницы |