Показать сообщение отдельно
  #2  
Старый 07.03.2018, 23:49
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

http://www.delphisources.ru/forum/sh...ad.php?t=26859

Небольшое размышление: рандомное перемешивание может вызвать забавную ситуацию - некоторые строки могут быть "посланы" в результирующий файл несколько раз, а другие остаться даже неупомянутыми в нём, такова специфика системного "блендера", решение видится в таком варианте - предварительно собрать рандомный массив индексов строк с проверкой на дубляж/отсутствие их в нём и лишь после его формирования произвести перенос исходных строк в конечный файл посредством seek > readln > writeln простым проходом по элементам этого массива с последовательным считыванием их значений, по-другому вроде решение не наблюдается

З.Ы. Поскольку текстовый файл допускает лишь одностороннее чтение, только вперёд, вариант получился довольно медленным т.к. при переходе на нужную строчку необходимо каждый раз возвращаться в начало файла, много циклов, но к сожалению, иначе никак
Код:
var
    i, j, b: integer;
    ft, ft2: TextFile;
    s: string;
    sc: array of integer;
begin
 Randomize;
 AssignFile(ft, '1.txt');
 Reset(ft);
 i:= 0;

 // Подсчёт количества строк в файле
 while not Eof(ft) do
  begin
   Readln(ft);
   Inc(i);
  end;

 SetLength(sc, i);

 // Заполнение массива индексами строк
 for i := Low(sc) to High(sc) do sc[i]:= i;

 // Перемешивание индексов
 for i := High(sc) downto Low(sc) do
  begin
   b:= Random(i);
   j:= sc[b];
   sc[b]:= sc[i];
   sc[i]:= j;
  end;

 AssignFile(ft2, '2.txt');
 Rewrite(ft2);

 for i := Low(sc) to High(sc) do
  begin

   // Имитация seek
   Reset(ft);
   for j:= 0 to sc[i] do Readln(ft, s);
   
   Writeln(ft2, s);
  end;

 CloseFile(ft);
 CloseFile(ft2);
end;
Ответить с цитированием