Форум: "Основная";
Текущий архив: 2003.03.06;
Скачать: [xml.tar.bz2];
Внизmap Найти похожие ветки
← →
race1 (2003-02-22 07:29) [0]задача - есть большой файл и надо в этом файле некоторые строчки поправить. можно конечно и readln\writeln, но есть более изящное решение - filemaping. с самим мапингом проблем нет. получили указатель на данные. но теперь как читать файл построчно и так же какие-то строчки записывать?
← →
Романов Р.В. (2003-02-22 08:13) [1]Насколько я помню эта функция возвращяет определенную строку из файла. Попробуй разобраться
MBo © (07.02.03 16:57)
Вариант для чтения единственной строки:
function GetNthLineFromEnd(const NumFromEnd:Integer;const FileName:string):string;
var
FileH: THandle;
MapH: THandle;
Size,Count: Integer;
PMap,PB: PByte;
PEnd:PChar;
begin
Assert(FileExists(FileName),"File not found!");
FileH:=FileOpen(FileName, fmOpenReadWrite);
if FileH<>INVALID_HANDLE_VALUE then begin
Size:=GetFileSize(FileH, nil);
MapH:=CreateFileMapping(FileH,nil,PAGE_READONLY,0,Size,nil);
if MapH<>0 then begin
PMap:=MapViewOfFile(MapH,FILE_MAP_READ,0,0,Size);
if PMap<>Nil then begin
PB:=PMap;
inc(PB, Size);
if PB^<>10 then
Count:=1
else
Count:=0;
repeat
Dec(PB);
if PB^=10 then
Inc(Count);
until (Count>NumFromEnd) or (PB=PMAP);
if PB<>PMap then
Inc(PB);
PEnd:=StrScan(PChar(PB),#13);
if PEnd=nil then begin
PEnd:=Pchar(PMap);
Inc(PEnd,Size);
end;
SetString(Result, PChar(PB), PEnd-PB);
UnmapViewOfFile(PMap);
end;
CloseHandle(MapH);
end;
CloseHandle(FileH);
end;
end;
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2003.03.06;
Скачать: [xml.tar.bz2];
Память: 0.44 MB
Время: 0.009 c