20. 11.

看书上说文件分为文本文件,类型文件(纪录文件),无类型文件(二进制文件);

现在我有1个exe程序,但是我想把他的ini配置文件写到exe文件的尾部,

通过分割二进制文件,分割出配置文件:

看网上说函数filewrite,fileread,blockwrite,blockread,都可以对该类型的文件进行操作,我是这样定义的:
var
x,x1:Integer;
y,y2:string;
begin
x:=FileOpen('1.wma',fmOpenReadWrite);
if x>0 then
begin
  x1:=FileSeek(x,0,2);
  FileSeek(x,0,0);
  y:=StringOfChar(#0,x1);
  FileRead(x,y[1],x1);
  FileClose(x);
  x:=FileOpen('2.wma',fmOpenReadWrite);
  if x>0 then
  begin
    y2:='|–|'+y[1];
    FileWrite(x,y1,x1);
    FileClose(x);
  end;
end;
end;

但是我再用string类型数据取出这段二进制码,查找不到我定义的'|–|'字符,请各位大虾帮忙~!,书上说存取二进制数据是不分数据类型的啊!为什么不可以???

建议不这么做
效率太低了

引用 1 楼 laorer 的回复:
你这种做法不是很好,会被杀毒软件认为是病毒的

你知道应该怎么作吗?老大

巨汗!!!

里面写的是二进制的,但用文件打开的是十六进制的,你写入的是ASCII码的,这个…….

你最好是打开一个文件,然后,把ASCII码转成十六进制.

我只想知道为什么我写入的字符|–|找不到,是不是应该先把他写成二进制格式再放入,还是???

引用 4 楼 nbzip 的回复:
巨汗!!!

里面写的是二进制的,但用文件打开的是十六进制的,你写入的是ASCII码的,这个…….

你最好是打开一个文件,然后,把ASCII码转成十六进制.

你的意思是说用FileOpen打开文件,用FileRead读入的是16进制的数据,我应该先把|-|转换为16进制的,然后写入就没有问题了??是不是老大

做个记号
FileRead(x,y[1],x1);
y又不是数组,这样取值对吗?

引用 7 楼 zhangxiaommmm 的回复:
做个记号
FileRead(x,y[1],x1);
y又不是数组,这样取值对吗?

其实我对文件操作也不是很了解,具体为什么要这样取出数据,我也说不上来,反正上面的代码要想完全取出整个文件的内容就必须这样写,否则编译器也会报错,具体,不知道,

                              ———请各位老大回答正题啊,給个例子把,谢谢了

。。。。。。。。。。现在这么多人对计算机内部数据什么类型什么格式不了解??????都是程序员吗?还是学生?

唉。。。。。。。。。。。。。。。

计算机内部数据不分十进制,十六进制的,它只以二进制形式存起来,显示的时候才会有进制问题。

字符及字符串存进去取出来,有进制问题????????

唉,我自己测试出来了,什么进制转换,都不用,直接用filewrite写进去就是了,我用UltraEdit-32看到我的程序后面有我写的内容了~!……….结帖郁闷,本来问问题的,不来回答都说写不着边的问题,郁闷的要紧~!

引用 4 楼 nbzip 的回复:
巨汗!!!

里面写的是二进制的,但用文件打开的是十六进制的,你写入的是ASCII码的,这个…….

你最好是打开一个文件,然后,把ASCII码转成十六进制.


不知所云。

引用 10 楼 smabl1234 的回复:
唉,我自己测试出来了,什么进制转换,都不用,直接用filewrite写进去就是了,我用UltraEdit-32看到我的程序后面有我写的内容了~!……….结帖郁闷,本来问问题的,不来回答都说写不着边的问题,郁闷的要紧~!

个人的建议是,如果是按这种方式去操作,最好在文件的末尾,比如用四个字节做一个特殊的标记,再往前的位置存储配置文件的长度,然后再往前放文件的内容。
读取时,先从末尾读取标记,如果读取文件的末尾的标记正常,则,继续往前读长度,之后再根据长度往前读文件数据。

类似的东西,比较典型的用例,就是早期版本的可以自播放的Flash(exe程序自己播放程序末尾的Flash文件).


标签: , ,