Guest User

Untitled

a guest
Mar 23rd, 2018
84
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.78 KB | None | 0 0
  1. procedure TForm1.Button1Click(Sender: TObject);
  2. var
  3. s: TStringList;
  4. z, p, q: Integer;
  5. begin
  6. s := TStringList.Create;
  7. s.LoadFromFile('C:text.txt');
  8. z := 50;
  9. while (z > 0) do begin
  10. p := random(s.Count);
  11. q := random(s.Count);
  12. s.Exchange(p, q);
  13. dec(z);
  14. end;
  15. s.SaveToFile('c:text.txt');
  16. s.Free;
  17. end;
  18.  
  19. var
  20. z, p, q: Integer;
  21. ft, ft2: TextFile;
  22. s:string;
  23. begin
  24. if OpenDialog1.Execute then
  25. begin
  26. AssignFile(ft, OpenDialog1.FileName);
  27. Reset(ft);
  28. AssignFile(ft2, ExtractFileDir(OpenDialog1.FileName)+'rez.txt');
  29. Rewrite(ft2); // чтобы создался новый, если нету, или перезаписался с нуля
  30. Append(ft2); // чтобы можно было добавлять строки, а не перезаписывать каждый раз
  31. begin
  32. while not eof(ft) do
  33. begin
  34. readln(ft,s);
  35. //////////////////////////////////////
  36. Вот тут помогите дописать перемешивание строк?
  37. //////////////////////////////////////
  38. writeln(ft2,s)
  39. end;
  40. closefile(ft);
  41. closefile(ft2);
  42. end;
  43. end;
  44. end;
  45.  
  46. uses
  47. System.Classes,
  48. System.Generics.Collections,
  49. System.Generics.Defaults;
  50.  
  51. type
  52. TLineInfo = record
  53. LineNum: Integer;
  54. Length: Integer;
  55. end;
  56.  
  57. procedure ReadLines(AList: TList<TLineInfo>; const AFileName: string);
  58. var
  59. LStr: AnsiString;
  60. LFile: TextFile;
  61. LInfo: TLineInfo;
  62. begin
  63. LInfo.LineNum := 0;
  64. AssignFile(LFile, AFileName);
  65. Reset(LFile);
  66. try
  67. while not Eof(LFile) do begin
  68. Readln(LFile, LStr);
  69. LInfo.Length := Length(LStr) + Length(sLineBreak);
  70. AList.Add(LInfo);
  71. Inc(LInfo.LineNum);
  72. end;
  73. finally
  74. Close(LFile);
  75. end;
  76. end;
  77.  
  78. procedure ShuffileLines(AList: TList<TLineInfo>);
  79. begin
  80. AList.Sort(TComparer<TLineInfo>.Construct(
  81. function (const AItem1, AItem2: TLineInfo): Integer
  82. begin
  83. Result := Random(3) - 1;
  84. end
  85. ))
  86. end;
  87.  
  88. procedure MakeIndices(AList: TList<TLineInfo>; AIndices: TDictionary<Integer, Integer>);
  89. var
  90. Li: Integer;
  91. LOffset: Integer;
  92. LInfo: TLineInfo;
  93. begin
  94. LOffset := 0;
  95. for Li := AList.Count - 1 downto 0 do begin
  96. LInfo := AList[Li];
  97. AList.Delete(Li);
  98. AIndices.Add(LInfo.LineNum, LOffset);
  99. Inc(LOffset, LInfo.Length);
  100. end;
  101. end;
  102.  
  103. procedure WriteLines(AIndices: TDictionary<Integer, Integer>; const AFileName: string);
  104. const
  105. CRLF: AnsiString = sLineBreak;
  106. var
  107. LStr: AnsiString;
  108. LSrcFile: TextFile;
  109. LDstFile: TStream;
  110. LIdx: Integer;
  111. LOffset: Integer;
  112. begin
  113. LIdx := 0;
  114. AssignFile(LSrcFile, AFileName);
  115. Reset(LSrcFile);
  116. try
  117. LDstFile := TFileStream.Create(AFileName + '.new', fmCreate);
  118. try
  119. while not Eof(LSrcFile) do begin
  120. Readln(LSrcFile, LStr);
  121. LOffset := AIndices[LIdx];
  122. LDstFile.Position := LOffset;
  123. LDstFile.WriteBuffer(LStr[1], Length(LStr) * SizeOf(LStr[1]));
  124. LDstFile.WriteBuffer(CRLF[1], Length(CRLF) * SizeOf(CRLF[1]));
  125. Inc(LIdx);
  126. end;
  127. finally
  128. LDstFile.Free;
  129. end;
  130. finally
  131. Close(LSrcFile);
  132. end;
  133. end;
  134.  
  135. procedure ShuffileFile(const AFileName: string);
  136. var
  137. LList: TList<TLineInfo>;
  138. LIndices: TDictionary<Integer, Integer>;
  139. begin
  140. LList := TList<TLineInfo>.Create;
  141. try
  142. // Считываем информацию о строках из файла
  143. ReadLines(LList, AFileName);
  144. // Перемешиваем информацию о строках
  145. ShuffileLines(LList);
  146. LIndices := TDictionary<Integer, Integer>.Create(LList.Count);
  147. try
  148. // Создаем индекс смещений
  149. MakeIndices(LList, LIndices);
  150. // Перемешиваем строки в файле
  151. WriteLines(LIndices, AFileName);
  152. finally
  153. LIndices.Free;
  154. end;
  155. finally
  156. LList.Free;
  157. end;
  158. end;
Add Comment
Please, Sign In to add comment