Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.12.23;
Скачать: CL | DM;

Вниз

Прочитать из файла!   Найти похожие ветки 

 
The_Vizit0r   (2002-12-09 17:54) [0]

Народ помогите!
У меня есть большой файл! Нужно прочитать из него только последние три строчки! Можно ли сделать так, чтобы прочитать только 3 последнии строчки не читая всех предидущих(а то долго)! :(
Если можно, то приведите пример кода! Заранее благодарен!


 
Kotka ©   (2002-12-09 17:58) [1]

>Можно ли сделать так, чтобы прочитать только 3 последнии строчки не читая всех предидущих

Вряд ли. Ты же не знаешь их точную длину! Или знаешь?


 
The_Vizit0r   (2002-12-09 18:01) [2]

Ты имеешь ввиду строк? То знаю, только в сиволах


 
MBo ©   (2002-12-09 18:14) [3]

считай конец файла (например, TfileStram), ищи символы перевода строк.


 
han_malign ©   (2002-12-09 18:27) [4]

если размер строк известен то через API примерно так(hFile открывается в CreateFile):
var _total: int64;
begin
with LARGE_INTEGER(_total) do begin
LowPart:=GetFileSize(hFile,@HighPart);
if(LowPart=$FFFFFFFF)then begin
Result:=GetLastError;
if(Result<>NO_ERROR)then exit;
end;
end;
dec(_total,(cDefaultStrLength+2)*3);
with LARGE_INTEGER(_total) do
LowPart:=SetFilePointer(hFile,LowPart,@HighPart,FILE_BEGIN);
if(LARGE_INTEGER(aOffs).LowPart<>$FFFFFFFF)
then begin
Result:=NO_ERROR;
end else Result:=GetLastError;
ну а дальше читаешь.


 
MBo ©   (2002-12-10 07:22) [5]

procedure TForm1.Button1Click(Sender: TObject);
var fs:TFileStream;
buf:array[0..4095] of char;
NStr,i,j,BufSize,OldPos:integer;
s:string;
begin
NStr:=3;
fs:=TFileStream.Create("e:\zz.txt",fmOpenRead or fmShareDenyNone);
BufSize:=4096;
if fs.Size<BufSize then
BufSize:=fs.Size;
fs.Seek(-BufSize,soFromEnd);
fs.Read(buf,bufsize);
if buf[bufsize-1]=#10 then
OldPos:=BufSize-1
else
OldPos:=BufSize+1;
j:=0;
for i:=bufsize-2 downto 0 do begin
//последняя пустая строчка не учитывается. если нужна, то i:=bufsize-1
if buf[i]=#10 then begin
SetLength(s,OldPos-i-2);
Move(buf[i+1],s[1],OldPos-i-2);
OldPos:=i;
Memo1.Lines.Add(s);
inc(j);
if j=NStr then Break;
end;
end;
fs.Free;
end;


 
uu ©   (2002-12-10 18:58) [6]

unit Unit2;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
public
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
const
N = 15; // Сколько символов в этих трех строках (не считая переводы строк)
procedure TForm1.Button1Click(Sender: TObject);
var
F: file of Char;
S: string;
Ch: Char;
begin
AssignFile(F, "c:\temp\myfile.txt");
Reset(F);
Seek(F, FileSize(F)-N-3*2);
S := "";
while not EOF(F) do begin
Read(F, Ch);
S := S+Ch;
end;
CloseFile(F);
ShowMessage(S);
end;
end.


 
не понял   (2002-12-10 19:07) [7]

Так ведь ежли файл текстовый, то:
1. Создаешь TStringList
2. TStringList.LoadFromFile("*.txt")
3. Количество строк = StringList.Count
4. А вот и строки:
StringList.strings[StringList.Count-1]
StringList.strings[StringList.Count-2]
StringList.strings[StringList.Count-3]
5. Само собой учитываем количство строк StringList.Count, что б не глючило
6. Конечно память скушает, зато легко



Страницы: 1 вся ветка

Текущий архив: 2002.12.23;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.014 c
6-74872
Barman
2002-10-19 10:54
2002.12.23
Поймать сообщение net send


4-75050
pag77
2002-11-07 19:51
2002.12.23
выключить комп под XP


14-74960
aterm
2002-12-03 11:04
2002.12.23
как отловить вставку из буфера в определенную TMemo?


14-74904
Arhangel
2002-12-01 13:02
2002.12.23
Зарание извеняюсь за это сообщение!


14-74994
sanilo
2002-12-04 11:21
2002.12.23
W2K