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

Delphi Sources



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

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

Мне нужно рандомно выдать из файла текст между разделителем '#' к примеру в файле такая запись:
Цитата:
#
текст1
#
текст2
текст2
#
текст3
#
и мне нужно рандомно выдать между '#' текст.
Загружаю весь файл в переменную и дальше думаю надо вести поиск по '#' в файле подсчитать их число и копировать, подскажите точней
Ответить с цитированием
  #2  
Старый 05.01.2011, 15:49
Аватар для Bargest
Bargest Bargest вне форума
Профессионал
 
Регистрация: 19.10.2010
Адрес: Москва
Сообщения: 2,390
Версия Delphi: XE3/VS12/FASM
Репутация: 14665
По умолчанию

узнаешь число этих # = N, потом берешь random(N-1)+1, ищешь K-ю решетку (нумеруются теперь с 1) и копируешь весь текст до K+1й
__________________
jmp $ ; Happy End!
The Cake Is A Lie.
Ответить с цитированием
  #3  
Старый 05.01.2011, 16:23
Аватар для ALexandr555
ALexandr555 ALexandr555 вне форума
Специалист
 
Регистрация: 09.10.2010
Адрес: Тольятти
Сообщения: 803
Версия Delphi: Delphi 7
Репутация: 2064
По умолчанию

как узнать число? и искать определенную 2 к примеру
Ответить с цитированием
  #4  
Старый 05.01.2011, 16:30
Аватар для v1s2222
v1s2222 v1s2222 вне форума
Продвинутый
 
Регистрация: 07.09.2010
Сообщения: 726
Репутация: 26711
По умолчанию

Загрузил в строку, и циклом проверяешь символы.
Код:
var
  s: TStringList;
  i: integer;
  N: Inetger;
begin
  N := 0;
  s := TStringList.Create;
  s.LoadFromFile(...);
{
  for i:=0 to s.Count-1 do
    for k:=1 to Length(s.Strings[i]) do
      if(s.Strings[i][k] = '#') then
        inc(N);
} 
// или
  for i:=1 to Length(s.Text) do
    if(s.Text[i] = '#') then
      inc(N);
///
Но я считаю надо искать не только кол-во, но и положение "#". Чтоб потом было легче копировать.
Как-то так:
Код:
type m=record
  x, y: integer;

var
  m_: array of m;
  countN: integer;
begin
  setlength(m_, 1);
... // и дальше все тоже самое,только с учетом, пр нахождении знака "#" надо не только увеличивать их кол-во, но и записывать его местоположение в тексте.
__________________
Помогаю за Спасибо
Ответить с цитированием
  #5  
Старый 05.01.2011, 16:33
Аватар для deltas
deltas deltas вне форума
Новичок
 
Регистрация: 22.11.2010
Сообщения: 99
Репутация: 47
По умолчанию

Все как-то сложно, я обычно делаю так - загружаю файл в листбокс а потом :
Код:
procedure TForm1.Button1Click(Sender: TObject);
var a:String; s:integer;
begin
 S:=Random(ListBox1.Items.Count-1);
 A:=Listbox1.Items.Strings[s];
 if a='#' then A:=Listbox1.Items.Strings[s+1];
 Label1.Caption:=A;
end;
Ответить с цитированием
  #6  
Старый 05.01.2011, 16:40
Аватар для v1s2222
v1s2222 v1s2222 вне форума
Продвинутый
 
Регистрация: 07.09.2010
Сообщения: 726
Репутация: 26711
По умолчанию

Цитата:
Сообщение от deltas
Все как-то сложно, я обычно делаю так - загружаю файл в листбокс а потом...
Ты не учел, что после знака "#" может идти несколько строк и всех их надо ввести, а не одну.
__________________
Помогаю за Спасибо
Ответить с цитированием
  #7  
Старый 05.01.2011, 16:54
Аватар для ALexandr555
ALexandr555 ALexandr555 вне форума
Специалист
 
Регистрация: 09.10.2010
Адрес: Тольятти
Сообщения: 803
Версия Delphi: Delphi 7
Репутация: 2064
По умолчанию

v1s2222, сделал как ты говоришь считает их, но как мне записать в mrecord позицию

Последний раз редактировалось ALexandr555, 05.01.2011 в 17:00.
Ответить с цитированием
  #8  
Старый 05.01.2011, 17:02
Аватар для v1s2222
v1s2222 v1s2222 вне форума
Продвинутый
 
Регистрация: 07.09.2010
Сообщения: 726
Репутация: 26711
По умолчанию

Код:
...
  for i:=0 to s.Count-1 do
    for k:=1 to Length(s.Strings[i]) do begin
      m_[Q].X := i;
      m_[Q].Y := k;
Где Q - это индекс массива.
__________________
Помогаю за Спасибо
Ответить с цитированием
  #9  
Старый 05.01.2011, 17:14
Аватар для ALexandr555
ALexandr555 ALexandr555 вне форума
Специалист
 
Регистрация: 09.10.2010
Адрес: Тольятти
Сообщения: 803
Версия Delphi: Delphi 7
Репутация: 2064
По умолчанию

Код:
for i:=0 to s.Count-1 do
    for k:=1 to Length(s.Strings[i]) do
      if(s.Strings[i][k] = '#') then
       begin
        m_[N].X := i;
        m_[N].Y := k;
        inc(N);
        end;

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

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

нельзя ли лучше проще найти позицию к примеру 5 символа # сразу
Ответить с цитированием
  #12  
Старый 05.01.2011, 19:16
Аватар для v1s2222
v1s2222 v1s2222 вне форума
Продвинутый
 
Регистрация: 07.09.2010
Сообщения: 726
Репутация: 26711
По умолчанию

Можно. Хоть так:
Код:
uses StrUtils;

...
X:=0;
for i:=1 to 5 do // на 5 позицию
  X := X+1+PosEx('#', S);
Теперь X - это номер 5 сивола "#".
Но я говорю, что выше описанный мной метод будет эффективнее и не будет разных ошибок... вот и все.
__________________
Помогаю за Спасибо
Ответить с цитированием
  #13  
Старый 05.01.2011, 19:31
Аватар для ALexandr555
ALexandr555 ALexandr555 вне форума
Специалист
 
Регистрация: 09.10.2010
Адрес: Тольятти
Сообщения: 803
Версия Delphi: Delphi 7
Репутация: 2064
По умолчанию

Код:
procedure TForm1.Button3Click(Sender: TObject);
var
I,k: integer;
s: TStringList;
m_: array of m;
countN: integer;

begin
 setlength(m_, 1);
  N := 0;
  s := TStringList.Create;
  s.LoadFromFile('spam.txt');

for i:=0 to s.Count-1 do
    for k:=1 to Length(s.Strings[i]) do
      if(s.Strings[i][k] = '#') then
       begin
        inc(N);
        ListBox1.Items.Add(inttostr(I));
        end;

end;

procedure TForm1.Button4Click(Sender: TObject);
var
ns,i: integer;
s: TStringList;
begin
memo1.clear;
s := TStringList.Create;
s.LoadFromFile('spam.txt');
Randomize;
NS:=random(N);
for i:=(strToint(ListBox1.Items.Strings[NS])+1) to (strToint(ListBox1.Items.Strings[NS+1])-1) do
memo1.Lines.Add(s.Strings[i]);
end;
сделал уже так сначало загружаю в лист бокс номера строк где символ # затем по нему ищю
Ответить с цитированием
  #14  
Старый 05.01.2011, 19:34
Аватар для ALexandr555
ALexandr555 ALexandr555 вне форума
Специалист
 
Регистрация: 09.10.2010
Адрес: Тольятти
Сообщения: 803
Версия Delphi: Delphi 7
Репутация: 2064
По умолчанию

NS:=1+random(N);
забыл написать вроде так верней будет
Ответить с цитированием
  #15  
Старый 05.01.2011, 19:38
Аватар для ALexandr555
ALexandr555 ALexandr555 вне форума
Специалист
 
Регистрация: 09.10.2010
Адрес: Тольятти
Сообщения: 803
Версия Delphi: Delphi 7
Репутация: 2064
По умолчанию

Код:
begin
 setlength(m_, 1);
  N := 0;
  s := TStringList.Create;
  s.LoadFromFile('spam.txt');
ListBox1.Items.Add(' ');                                                                                                                                                  for i:=0 to s.Count-1 do
    for k:=1 to Length(s.Strings[i]) do
      if(s.Strings[i][k] = '#') then
       begin
        inc(N);
        ListBox1.Items.Add(inttostr(I));
        end;
вот тут добавить чтобы строки с единицы велись

Последний раз редактировалось ALexandr555, 05.01.2011 в 19:45.
Ответить с цитированием
Ответ


Delphi Sources

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

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

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

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


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


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

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