Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 05.03.2013, 19:16
Аватар для Uniq!
Uniq! Uniq! вне форума
Местный
 
Регистрация: 29.09.2010
Сообщения: 539
Версия Delphi: Delphi XE3
Репутация: 374
По умолчанию 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  
Старый 05.03.2013, 20:22
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,029
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Лучше тут FileStream не использовать.
читай либо через TStringList, либо через стандартные паскалевские файловые операции.
Ответить с цитированием
  #3  
Старый 05.03.2013, 20:25
Аватар для Uniq!
Uniq! Uniq! вне форума
Местный
 
Регистрация: 29.09.2010
Сообщения: 539
Версия Delphi: Delphi XE3
Репутация: 374
По умолчанию

Цитата:
Сообщение от lmikle
Лучше тут FileStream не использовать.

Причина такого "лучше"?
У меня файл на от 11к до 65к каналов (т.е. строк)
Ответить с цитированием
  #4  
Старый 05.03.2013, 20:32
Аватар для M.A.D.M.A.N.
M.A.D.M.A.N. M.A.D.M.A.N. вне форума
Sir Richard Abramson
 
Регистрация: 05.04.2008
Сообщения: 5,505
Версия Delphi: XE10
Репутация: выкл
По умолчанию

Сложность реализации и отсутствие гибкости.
__________________
— Как тебя понимать?
— Понимать меня не обязательно. Обязательно меня любить и кормить вовремя.


На Delphi, увы, больше не программирую.
Рекомендуемая литература по программированию
Ответить с цитированием
  #5  
Старый 05.03.2013, 20:47
Аватар для Uniq!
Uniq! Uniq! вне форума
Местный
 
Регистрация: 29.09.2010
Сообщения: 539
Версия Delphi: Delphi XE3
Репутация: 374
По умолчанию

Цитата:
Сообщение от M.A.D.M.A.N.
Сложность реализации и отсутствие гибкости.

на 22к стандартным while not EoF(graphFile) do потрачено 98 секунд.
Это никуда не годится. И всё же?...
Ответить с цитированием
  #6  
Старый 05.03.2013, 21:20
Аватар для Bargest
Bargest Bargest вне форума
Профессионал
 
Регистрация: 19.10.2010
Адрес: Москва
Сообщения: 2,390
Версия Delphi: XE3/VS12/FASM
Репутация: 14665
По умолчанию

Проще всего через TStringList. Он сам разнесет на список строк. Сразу же получаешь размер результирующих массивов, выделяешь, в первый кладешь все до пробелов (через POS), во второй - все после. Если вначале есть пробелы - можно вылечить через trim. Или просто поискать первый не пробел.
__________________
jmp $ ; Happy End!
The Cake Is A Lie.
Ответить с цитированием
Этот пользователь сказал Спасибо Bargest за это полезное сообщение:
Uniq! (05.03.2013)
  #7  
Старый 05.03.2013, 21:23
Аватар для Uniq!
Uniq! Uniq! вне форума
Местный
 
Регистрация: 29.09.2010
Сообщения: 539
Версия Delphi: Delphi XE3
Репутация: 374
По умолчанию

Цитата:
Сообщение от Bargest
выделяешь, в первый кладешь все до пробелов (через POS), во второй - все после. Если вначале есть пробелы - можно вылечить через trim.

98 секунд повторюсь. Очень долго.
Ответить с цитированием
  #8  
Старый 05.03.2013, 21:36
Аватар для Bargest
Bargest Bargest вне форума
Профессионал
 
Регистрация: 19.10.2010
Адрес: Москва
Сообщения: 2,390
Версия Delphi: XE3/VS12/FASM
Репутация: 14665
По умолчанию

Код приведи. Не может там быть 98 секунд.
__________________
jmp $ ; Happy End!
The Cake Is A Lie.
Ответить с цитированием
  #9  
Старый 05.03.2013, 21:48
Аватар для Uniq!
Uniq! Uniq! вне форума
Местный
 
Регистрация: 29.09.2010
Сообщения: 539
Версия Delphi: Delphi XE3
Репутация: 374
По умолчанию

Код:
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  
Старый 05.03.2013, 22:04
Аватар для Bargest
Bargest Bargest вне форума
Профессионал
 
Регистрация: 19.10.2010
Адрес: Москва
Сообщения: 2,390
Версия Delphi: XE3/VS12/FASM
Репутация: 14665
По умолчанию

Весь косяк, думаю, в постоянной релокации массивов. Это очень долго. Ну и чтение по строчкам (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;
Чуть быстрее, чем моментально (тестил на 200 тыс строк, строки скопированы из твоего первого поста и размножены).

ЗЫЖ не обращай внимания на getmem, это еще с древних времен. PascalSchool так сказать. Юзай SetLength.
__________________
jmp $ ; Happy End!
The Cake Is A Lie.

Последний раз редактировалось Bargest, 05.03.2013 в 22:11.
Ответить с цитированием
Этот пользователь сказал Спасибо Bargest за это полезное сообщение:
Uniq! (05.03.2013)
  #11  
Старый 05.03.2013, 22:18
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Можно и так
Код:
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  
Старый 05.03.2013, 23:51
Аватар для Aristarh Dark
Aristarh Dark Aristarh Dark вне форума
Модератор
 
Регистрация: 07.10.2005
Адрес: Москва
Сообщения: 2,906
Версия Delphi: Delphi XE
Репутация: выкл
По умолчанию

Вот сижу и думаю: уже говорить "как дети" или еще подождем решения?
__________________
Некоторые программисты настолько ленивы, что сразу пишут рабочий код.

Если вас наказали ни за что - радуйтесь: вы ни в чем не виноваты.
Ответить с цитированием
  #13  
Старый 06.03.2013, 10:11
icWasya icWasya вне форума
Местный
 
Регистрация: 09.11.2010
Сообщения: 499
Репутация: 10
По умолчанию

по поводу самого первого сабжа
Код:
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 параметр, а передают массив - то лучше всегда указывать не массив, а первый элемент массива. В случае статического массива это одно и то же, а в случае динамического - две большие разницы
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 02:48.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter