Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- procedure TForm1.Button1Click(Sender: TObject);
- var
- s: TStringList;
- z, p, q: Integer;
- begin
- s := TStringList.Create;
- s.LoadFromFile('C:text.txt');
- z := 50;
- while (z > 0) do begin
- p := random(s.Count);
- q := random(s.Count);
- s.Exchange(p, q);
- dec(z);
- end;
- s.SaveToFile('c:text.txt');
- s.Free;
- end;
- var
- z, p, q: Integer;
- ft, ft2: TextFile;
- s:string;
- begin
- if OpenDialog1.Execute then
- begin
- AssignFile(ft, OpenDialog1.FileName);
- Reset(ft);
- AssignFile(ft2, ExtractFileDir(OpenDialog1.FileName)+'rez.txt');
- Rewrite(ft2); // чтобы создался новый, если нету, или перезаписался с нуля
- Append(ft2); // чтобы можно было добавлять строки, а не перезаписывать каждый раз
- begin
- while not eof(ft) do
- begin
- readln(ft,s);
- //////////////////////////////////////
- Вот тут помогите дописать перемешивание строк?
- //////////////////////////////////////
- writeln(ft2,s)
- end;
- closefile(ft);
- closefile(ft2);
- end;
- end;
- end;
- uses
- System.Classes,
- System.Generics.Collections,
- System.Generics.Defaults;
- type
- TLineInfo = record
- LineNum: Integer;
- Length: Integer;
- end;
- procedure ReadLines(AList: TList<TLineInfo>; const AFileName: string);
- var
- LStr: AnsiString;
- LFile: TextFile;
- LInfo: TLineInfo;
- begin
- LInfo.LineNum := 0;
- AssignFile(LFile, AFileName);
- Reset(LFile);
- try
- while not Eof(LFile) do begin
- Readln(LFile, LStr);
- LInfo.Length := Length(LStr) + Length(sLineBreak);
- AList.Add(LInfo);
- Inc(LInfo.LineNum);
- end;
- finally
- Close(LFile);
- end;
- end;
- procedure ShuffileLines(AList: TList<TLineInfo>);
- begin
- AList.Sort(TComparer<TLineInfo>.Construct(
- function (const AItem1, AItem2: TLineInfo): Integer
- begin
- Result := Random(3) - 1;
- end
- ))
- end;
- procedure MakeIndices(AList: TList<TLineInfo>; AIndices: TDictionary<Integer, Integer>);
- var
- Li: Integer;
- LOffset: Integer;
- LInfo: TLineInfo;
- begin
- LOffset := 0;
- for Li := AList.Count - 1 downto 0 do begin
- LInfo := AList[Li];
- AList.Delete(Li);
- AIndices.Add(LInfo.LineNum, LOffset);
- Inc(LOffset, LInfo.Length);
- end;
- end;
- procedure WriteLines(AIndices: TDictionary<Integer, Integer>; const AFileName: string);
- const
- CRLF: AnsiString = sLineBreak;
- var
- LStr: AnsiString;
- LSrcFile: TextFile;
- LDstFile: TStream;
- LIdx: Integer;
- LOffset: Integer;
- begin
- LIdx := 0;
- AssignFile(LSrcFile, AFileName);
- Reset(LSrcFile);
- try
- LDstFile := TFileStream.Create(AFileName + '.new', fmCreate);
- try
- while not Eof(LSrcFile) do begin
- Readln(LSrcFile, LStr);
- LOffset := AIndices[LIdx];
- LDstFile.Position := LOffset;
- LDstFile.WriteBuffer(LStr[1], Length(LStr) * SizeOf(LStr[1]));
- LDstFile.WriteBuffer(CRLF[1], Length(CRLF) * SizeOf(CRLF[1]));
- Inc(LIdx);
- end;
- finally
- LDstFile.Free;
- end;
- finally
- Close(LSrcFile);
- end;
- end;
- procedure ShuffileFile(const AFileName: string);
- var
- LList: TList<TLineInfo>;
- LIndices: TDictionary<Integer, Integer>;
- begin
- LList := TList<TLineInfo>.Create;
- try
- // Считываем информацию о строках из файла
- ReadLines(LList, AFileName);
- // Перемешиваем информацию о строках
- ShuffileLines(LList);
- LIndices := TDictionary<Integer, Integer>.Create(LList.Count);
- try
- // Создаем индекс смещений
- MakeIndices(LList, LIndices);
- // Перемешиваем строки в файле
- WriteLines(LIndices, AFileName);
- finally
- LIndices.Free;
- end;
- finally
- LList.Free;
- end;
- end;
Add Comment
Please, Sign In to add comment