Форум: "Основная";
Текущий архив: 2002.12.23;
Скачать: [xml.tar.bz2];
ВнизПрочитать из файла! Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.009 c