关于文本文件的几个问题(200分)

  • 主题发起人 商朝子
  • 开始时间

商朝子

Unregistered / Unconfirmed
GUEST, unregistred user!
我想在软件中把一些特定的记录存储在一个文件中,但我不希望该文件能被人用记事本打开,同时软件可以识别并使用该文件,请某位好心的大虾告诉俺方法.
另外小弟还想问一下如何在软件中读取文本文件中的记录,比如我在文本文件中录入了以下内容:
NAME=商朝子
怎样在软件中读取NAME的内容呢?(在不使用.ini文件的情况下).
还有就是怎样才能在文本文件中加入一行记录或删除(修改)特定的记录呢?
 
自己建立文件格式咯!
你好有钱!
这样不好,会通货膨胀的!
 
TO shadowno:
小弟太菜,大虾可否详细道来?
呜呜呜...
我以为和论坛一样,没想到还有什么积分,呜呜呜...
一会儿就浪费了300点...[:(][:(][:(]
 
可以用有类型文件,如

type

PhoneEntry = record
FirstName, LastName: string[20];
PhoneNumber: string[15];
Listed: Boolean;
end;
PhoneList = file of PhoneEntry;
 
这样的话不还是会被人用记事本打开吗?
苦恼中...[:(][:(][:(]
 
但是看到的是乱码啊
 
就是用类型文件了!
 
什么东西不能被记事本打开的,只要是保存在硬盘上的文件基本上都
可以被记事本打开的(除非有特殊字符的会有一部分看不到),关键
是看到的内容是否有意义。

就象是你用记事本打开Notepad.exe文件的时候,你打开了,却看不懂
 
不想让别人用即使本打开,只有自己定义文件格式,
例如:
Type
OneLine = String[191]; { 定义一行最大有191个字节 }

procedure writeOneLine(_item:string);
Var
_Line:OneLine;
TmFl : File;
begin
AssiGnFile(TmFl,'c:/oneline.bin');
If (fileexists('c:/oneline.bin')) then
begin
reset(tmfl,1);
seek(tmfl,filesize(tmfl));
end else
rewrite(tmfl,1);

_Line:=_item;
blockwrite(tmfl,_line,sizeof(OneLine));
closefile(tmfl);
end;

procedure tform1.button1click(sender:tobject);
// 把Edit1中的内容写入自定义文件中.
begin
writeOneLine(edit1.text); // 把Edit1中的内容写入自定义文件中.
end;

procedure TForm1.Button2Click(Sender: TObject);
// 把自定义文件读入memo1中.
Var
_Line:OneLine;
TmFl : File;
begin
AssiGnFile(TmFl,'c:/oneline.bin');
If (not fileexists('c:/oneline.bin')) then
begin
showmessage('file not exists!');
exit;
end else
reset(tmfl,1);
memo1.lines.clear;
while not eof(tmfl) do
begin
blockread(tmfl,_line,sizeof(OneLine));
memo1.lines.add(_line);
end;
closefile(tmfl);
end;
//这样别人用即使本打开的是乱码了!


例如读取 name=的内容.
function readitem(item:string):string;
// 把自定义文件读入memo1中.
Var
_Line:OneLine;
TmFl : File;
_pos:word;
begin
result:='空';
AssiGnFile(TmFl,'c:/oneline.bin');
If (not fileexists('c:/oneline.bin')) then
begin
showmessage('file not exists!');
exit;
end else
reset(tmfl,1);
while not eof(tmfl) do
begin
blockread(tmfl,_line,sizeof(OneLine));
_pos:=pos(uppercase(item)+'=',uppercase(_line));
if _pos<>0 then
begin
delete(_line,1,_pos+length(item+'=')-1);
result:=trim(_line);
closefile(tmfl);
exit;
end;
end;
closefile(tmfl);
end;

showmessage(readitem('NAME'));//显示name=的内容.

例如添加用
writeOneLine('name=商朝子');即可.

删除有点麻烦,但好人做到底,给你编:
function deleteitem(item:string):boolean;
// 把自定义文件读入memo1中.
Var
_Line:OneLine;
TmFl : File;
tfl : File;
_pos:word;
begin
result:=false;
AssiGnFile(TmFl,'c:/oneline.bin');
If (not fileexists('c:/oneline.bin')) then
begin
showmessage('file not exists!');
exit;
end else
reset(tmfl,1);
assignfile(tfl,'c:/oneline.1);
rewrite(tfl,1);
while not eof(tmfl) do
begin
blockread(tmfl,_line,sizeof(OneLine));
_pos:=pos(uppercase(item)+'=',uppercase(_line));
if _pos=0 then
blockwrite(tfl,_line,sizeof(OneLine));
end;
closefile(tmfl);
closefile(tfl);
erase(tmfl);
renamefile('c:/oneline.1','c:/oneline.bin');
result:=true
end;

例如删除用
deleteitem('name');即可.

 
可以考虑对文件进行加密,在你使用的时候先解密,再打开
 
procedure TForm1.Button1Click(Sender: TObject);
var
s:TStrings;
begin
s:=TStringList.Create;
s.LoadFromFile('d:/temp.txt');
s.Add('aaaaaaaa');//添加一行
s.Delete(0);//删除第一行
s.savetofile('d:/temp1.txt');
s.free;
end;
 
非常感谢各位.
(文件格式的问题俺也不是不知道,但...)
 
顶部