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

Delphi Sources



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

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 13.01.2012, 21:19
Аватар для ALexandr555
ALexandr555 ALexandr555 вне форума
Специалист
 
Регистрация: 09.10.2010
Адрес: Тольятти
Сообщения: 803
Версия Delphi: Delphi 7
Репутация: 2064
По умолчанию вывод рандома из файла

меня интересует два типа вывода рандом
случайная строка и с разделителем
случайная строка

разделитель
Цитата:
#
текст
текст
#
текст
#
текст
текст
текст
#
Код:
N:= -1;
S:= TStringList.Create;
S.LoadFromFile(extractfilepath(paramstr(0))+'файл.txt');
listS:=TStringList.Create;
for i:=0 to S.Count-1 do
      if(S.Strings[i] = '#') then
       begin
        inc(N);
        listS.Add(inttostr(I));
        end;
k:=random(N);
for i:=(strToint(listSpam.Strings[k])+1) to (strToint(listSpam.Strings[k+1])-1) do
result:=result+spamS.Strings[i]+#13#10;
гружу файл запоминаю места разделителей и их число а затем рандомно выбираю разделитель и копирую строки от него и до следующего.

просто случайная строка
Цитата:
текст
текст
текст
текст
Код:
S:= TStringList.Create;
S.LoadFromFile(extractfilepath(paramstr(0))+'файл.txt');
a:=random(s.Count);
Result:=xtazkont.Strings[a];
ну тут все просто...

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

Получаешь рандомом номер разделителя, построчно читаешь файл, пропускаешь N разделителей, выводишь до N+1-го. Юзается AssignFile, Reset, ReadLn, CloseFile и var f:text;
Можно предварительно посчитать число разделителей, также читая построчно. Чтобы все сразу не грузить. Хотя работать оно будет заметно медленнее.
__________________
jmp $ ; Happy End!
The Cake Is A Lie.

Последний раз редактировалось Bargest, 13.01.2012 в 21:30.
Ответить с цитированием
  #3  
Старый 13.01.2012, 21:35
Аватар для ALexandr555
ALexandr555 ALexandr555 вне форума
Специалист
 
Регистрация: 09.10.2010
Адрес: Тольятти
Сообщения: 803
Версия Delphi: Delphi 7
Репутация: 2064
По умолчанию

файл мне не известен соотвественно число разделителей тоже в нем
Ответить с цитированием
  #4  
Старый 13.01.2012, 22:05
Аватар для Bargest
Bargest Bargest вне форума
Профессионал
 
Регистрация: 19.10.2010
Адрес: Москва
Сообщения: 2,390
Версия Delphi: XE3/VS12/FASM
Репутация: 14665
По умолчанию

Цитата:
Сообщение от ALexandr555
файл мне не известен соотвественно число разделителей тоже в нем
Насчет "файл мне не известен" вообще не понял - а откуда тогда читать-то?
Насчет "число разделителей" - я ж написал: можно предварительно прочитать файл построчно и определить это число.
__________________
jmp $ ; Happy End!
The Cake Is A Lie.
Ответить с цитированием
  #5  
Старый 13.01.2012, 22:41
Аватар для ALexandr555
ALexandr555 ALexandr555 вне форума
Специалист
 
Регистрация: 09.10.2010
Адрес: Тольятти
Сообщения: 803
Версия Delphi: Delphi 7
Репутация: 2064
По умолчанию

я имею заранее не известен известен становится тогда когда надо сразу получить рандомный ответ
ну собственно мне понятно, а сколько это по времени вот будет? и не дергает ли сильно винт?

Последний раз редактировалось ALexandr555, 13.01.2012 в 22:48.
Ответить с цитированием
  #6  
Старый 13.01.2012, 22:49
Аватар для Bargest
Bargest Bargest вне форума
Профессионал
 
Регистрация: 19.10.2010
Адрес: Москва
Сообщения: 2,390
Версия Delphi: XE3/VS12/FASM
Репутация: 14665
По умолчанию

Файл становится известен, когда нужно получить ответ? Ну так и делать. В момент, когда нужно получить ответ, построчно прочитать файл, узнать кол-во разделителей и заодно их позиции, получить рандом, и построчно считать с позиции нужного разделителя до следующего. Вообщем на месте этого кода:
Код:
N:= -1;
S:= TStringList.Create;
S.LoadFromFile(extractfilepath(paramstr(0))+'файл.txt');
listS:=TStringList.Create;
for i:=0 to S.Count-1 do
      if(S.Strings[i] = '#') then
       begin
        inc(N);
        listS.Add(inttostr(I));
        end;
k:=random(N);
for i:=(strToint(listSpam.Strings[k])+1) to (strToint(listSpam.Strings[k+1])-1) do
result:=result+spamS.Strings[i]+#13#10;
__________________
jmp $ ; Happy End!
The Cake Is A Lie.
Ответить с цитированием
  #7  
Старый 14.01.2012, 01:05
Аватар для ALexandr555
ALexandr555 ALexandr555 вне форума
Специалист
 
Регистрация: 09.10.2010
Адрес: Тольятти
Сообщения: 803
Версия Delphi: Delphi 7
Репутация: 2064
По умолчанию

не проверял пока но вроде должно работать
винт не будет сильно дергать? если это вызывается около 200 раз в минуту
случайная строка
Код:
function TMyThread.random1(Myfile: string; nomer: integer): string;
var
f:TextFile;
n,r: integer;
begin
n:=0;
 AssignFile(f,MyFile+'.txt');
 Reset(f);
 While not EOF(f) do
  begin
   inc(n);
  end;
CloseFile(f);
r:=random(n)+1;
 Reset(f);
 While not EOF(f) do
  begin
   inc(n);
   if n=r then
    begin
     readln(f,result);
     break;
    end;
  end;
end;


с разделителем '#'

Код:
function TMyThread.random2(Myfile: string; nomer: integer): string;
var
f:TextFile;
buf: string;
n,r: integer;
begin
n:=-1;
 AssignFile(f,MyFile+'.txt');
 Reset(f);
 While not EOF(f) do
  begin
   readln(f,buf);
   if trim(buf)='#' then inc(n);
  end;
CloseFile(f);
r:=random(n)+1;
n:=0;
 Reset(f);
  While not EOF(f) do
  begin
   readln(f,buf);
   if n=r then
    begin
     if trim(buf)='#' then inc(n);
     if n=r then result:=result+#13#10+buf
     else break;
    end
   else if trim(buf)='#' then inc(n);
  end;
end;
Ответить с цитированием
  #8  
Старый 14.01.2012, 19:10
Аватар для Bargest
Bargest Bargest вне форума
Профессионал
 
Регистрация: 19.10.2010
Адрес: Москва
Сообщения: 2,390
Версия Delphi: XE3/VS12/FASM
Репутация: 14665
По умолчанию

Дергать хард будет сильно, и работать довольно медленно. Надо быстро - надо грузить целиком.
__________________
jmp $ ; Happy End!
The Cake Is A Lie.
Ответить с цитированием
  #9  
Старый 14.01.2012, 19:35
Аватар для ALexandr555
ALexandr555 ALexandr555 вне форума
Специалист
 
Регистрация: 09.10.2010
Адрес: Тольятти
Сообщения: 803
Версия Delphi: Delphi 7
Репутация: 2064
По умолчанию

понятно, сделаю тогда уж предварительную загрузку
Ответить с цитированием
Ответ


Delphi Sources

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

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

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

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


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


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

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

ВКонтакте   Facebook   Twitter