To 楼主:
1、有点空闲给你写了一段程序,用 Delphi 控制台程序编译,纯 Pascal。之所以没用 TP7 编译,一是我手头没有 TP7,二是解决问题必须要用到 BlockRead、BlockWrite 函数,用于精确控制读取、写入文件的字节数,而在 TP7 中这两个函数严格针对无类型文件,而我的程序又必须要设定文件以字节为单位(file of Byte),所以在 TP7 中无法发挥这两个函数的作用,Delphi 编译环境则不存在这个问题。
2、程序如下,有点小长:
program Project1;
{$APPTYPE CONSOLE}
//StrLCopy 在 SysUtils 单元,原样抄过来,一是为了减小文件大小,而是避免间接引用 Windows 单元
function StrLCopy(Dest: PChar; const Source: PChar; MaxLen: Cardinal): PChar; assembler;
asm
PUSH EDI
PUSH ESI
PUSH EBX
MOV ESI,EAX
MOV EDI,EDX
MOV EBX,ECX
XOR AL,AL
TEST ECX,ECX
JZ @@1
REPNE SCASB
JNE @@1
INC ECX
@@1: SUB EBX,ECX
MOV EDI,ESI
MOV ESI,EDX
MOV EDX,EDI
MOV ECX,EBX
SHR ECX,2
REP MOVSD
MOV ECX,EBX
AND ECX,3
REP MOVSB
STOSB
MOV EAX,EDX
POP EBX
POP ESI
POP EDI
end;
procedure InsertRecord(FileName, RecordStr: string);
const
INDEX_LEN = 10;
RECORD_SIZE = 10 + 10 + 2 + 2;
var
f: file of Byte;
iFileSize, iBufSize, i, r, lo, hi, mid: Longint;
buf: PChar;
function GetRecordIndex(RecNo: Longint): Longint;
begin
Result := 0;
if RecNo < 1 then Exit;
FillChar(buf^, INDEX_LEN + 1, 0);
Seek(f, (RecNo - 1)*RECORD_SIZE);
BlockRead(f, buf^, INDEX_LEN);
Val(buf, Result, i);
end;
begin
AssignFile(f, FileName);
Reset(f);
iFileSize := FileSize(f);
i := iFileSize mod RECORD_SIZE;
if i <> 0 then
begin
Seek(f, iFileSize);
BlockWrite(f, #13#10, 2);
Inc(iFileSize, RECORD_SIZE - i);
end;
//用折半查找插入点,存储于变量 lo 中
GetMem(buf, INDEX_LEN + 1);
FillChar(buf^, INDEX_LEN + 1, 0);
StrLCopy(buf, PChar(RecordStr), INDEX_LEN);
Val(buf, r, i);
lo := 1;
hi := iFileSize div RECORD_SIZE;
if r >= GetRecordIndex(hi) then
lo := hi + 1
else if r >= GetRecordIndex(lo) then
begin
while lo <= hi do
begin
mid := (lo + hi) div 2;
if r < GetRecordIndex(mid) then
hi := mid - 1
else lo := mid + 1;
end;
end;
FreeMem(buf);
lo := (lo - 1)*RECORD_SIZE;
//把新纪录插入到相应位置
iBufSize := iFileSize - lo + RECORD_SIZE;
GetMem(buf, iBufSize);
FillChar(buf^, RECORD_SIZE - 2, 0);
StrLCopy(buf, PChar(RecordStr), RECORD_SIZE - 2);
Move(#13#10, buf[RECORD_SIZE - 2], 2);
Seek(f, lo);
BlockRead(f, buf[RECORD_SIZE], iBufSize - RECORD_SIZE);
Seek(f, lo);
BlockWrite(f, buf^, iBufSize);
FreeMem(buf);
Close(f);
end;
begin
InsertRecord('d:/a.txt', '100000 大便 00');
end.
3、至于其他仁兄建议的 TStringList 您也可以试一试。不过我写的应该是最基本的代码,我对类不类的一向不感兴趣,程序能用就结贴,不能用也说一声,好吧?