1 | // TTextFileStream class by Chronos 12.9.2005
|
---|
2 | // Homepage: http://jirihajda.zdechov.net/
|
---|
3 |
|
---|
4 | unit UTextFileStream;
|
---|
5 |
|
---|
6 | interface
|
---|
7 |
|
---|
8 | uses Classes, Dialogs, SysUtils;
|
---|
9 |
|
---|
10 | type
|
---|
11 |
|
---|
12 | TTextFileStream = class(TFileStream)
|
---|
13 | private
|
---|
14 | FBuffer: string;
|
---|
15 | protected
|
---|
16 |
|
---|
17 | public
|
---|
18 | procedure WriteLn(Text: string);
|
---|
19 | function ReadLn: string;
|
---|
20 | function Seek(const Offset: Int64; Origin: TSeekOrigin): Int64; override;
|
---|
21 | function RowsCount: Integer;
|
---|
22 | end;
|
---|
23 |
|
---|
24 | implementation
|
---|
25 |
|
---|
26 | { TTextFileStream }
|
---|
27 |
|
---|
28 | function TTextFileStream.ReadLn: string;
|
---|
29 | const
|
---|
30 | BufferLength = 10000;
|
---|
31 | var
|
---|
32 | NewBuffer: string;
|
---|
33 | Readed: Integer;
|
---|
34 | begin
|
---|
35 | Readed:= 1;
|
---|
36 | while (Pos(#13,FBuffer) = 0) and (Readed > 0) do begin
|
---|
37 | SetLength(NewBuffer, BufferLength+2);
|
---|
38 | Readed:= Read(NewBuffer[1], BufferLength);
|
---|
39 | SetLength(NewBuffer, Readed);
|
---|
40 | FBuffer:= FBuffer + NewBuffer;
|
---|
41 | end;
|
---|
42 | if Pos(#13,FBuffer)>0 then begin
|
---|
43 | Result:= Copy(FBuffer, 1, Pos(#13,FBuffer)-1);
|
---|
44 | Delete(FBuffer, 1, Pos(#13,FBuffer)+1);
|
---|
45 | end else begin
|
---|
46 | Result:= FBuffer;
|
---|
47 | FBuffer:= '';
|
---|
48 | end;
|
---|
49 | end;
|
---|
50 |
|
---|
51 | function TTextFileStream.RowsCount: Integer;
|
---|
52 | begin
|
---|
53 | Result:= 1;
|
---|
54 | FBuffer:= '';
|
---|
55 | Seek(0, soBeginning);
|
---|
56 | while ReadLn <> '' do Inc(Result);
|
---|
57 | Seek(0, soBeginning);
|
---|
58 | end;
|
---|
59 |
|
---|
60 | function TTextFileStream.Seek(const Offset: Int64;
|
---|
61 | Origin: TSeekOrigin): Int64;
|
---|
62 | begin
|
---|
63 | if Origin = soCurrent then Result:= inherited Seek(Offset - Length(FBuffer), Origin)
|
---|
64 | else Result:= inherited Seek(Offset, Origin);
|
---|
65 | FBuffer:= '';
|
---|
66 | end;
|
---|
67 |
|
---|
68 | procedure TTextFileStream.WriteLn(Text: string);
|
---|
69 | const
|
---|
70 | NewLine = #13#10;
|
---|
71 | begin
|
---|
72 | Seek(0, soCurrent);
|
---|
73 | if Length(Text) > 0 then Write(Text[1], Length(Text));
|
---|
74 | Write(NewLine, 2);
|
---|
75 | end;
|
---|
76 |
|
---|
77 | end.
|
---|
78 | |
---|