我用filesize(f)為什麼總是返回0?(30分)

  • 主题发起人 主题发起人 maysally
  • 开始时间 开始时间

TO:jsxjd
如果是以Integer的方式写入,只占一个byte,不可见。
如果是以String的方式写入,占6个byte,可见。

文本文件容易被修改,不建议使用。
 
to jsxjd
请先看明白maysally的意思,他的意思是"不隻是讀出TXT文件的內容,
否則我也不用去想什麼記錄型文件了,因為我是從數據庫的TABLE中導出的文件,
一條記錄一行,各個字段之間用逗號隔開現在我想在每一行後面加上3個數字,
也用逗號隔開。"

 

好象变得很乱。我以前写的代码中有一个错误。
BlockWrite(CHECKFILE,rec,SizeOf(TCHECK));
应改为:
BlockWrite(CHECKFILE,rec,1);

>>>>我看到網上說任何類型的文件都可以看做是記錄型文件,為什麼TXT文件不可以呢?

只要有一定格式,文本文件就能看作是记录类型。
你可以试试下面的代码。

//更改记录格式
TYPE TCHECK=RECORD
NAME: array [0..20] of char;
HOBBY: array [0..20] of char;
LNUMBER: array [0..10] of char;
CRLF: array [0..1]of char;
END;
CHECKFILETYPE=FILE OF TCHECK;

//更改Button2Click
procedure TForm1.Button2Click(Sender: TObject);
VAR
CHECKFILE: CHECKFILETYPE;
rec: TCHECK;
i: integer;
a: string;
begin
ASSIGNFILE(CHECKFILE,'E:/test.TXT');
REWRITE(CHECKFILE);
for i := 1 to 8888 do
begin
FillChar(rec.HOBBY,Length(rec.HOBBY),$20);//填充空格,以下同
FillChar(rec.NAME,Length(rec.NAME),$20);
FillChar(rec.LNUMBER,Length(rec.LNUMBER),$20);
a := 'HOBBY'+IntToStr(i);
move(a[1],rec.HOBBY[0],Length(a));
a := 'NAME'+IntToStr(i);
move(a[1],rec.NAME[0],Length(a));
a := IntToStr(i);
move(a[1],rec.LNUMBER[0],Length(a));
rec.CRLF[0] := #13;
rec.CRLF[1] := #10;
BlockWrite(CHECKFILE,rec,1);
end;
CloseFile(CHECKFILE);
end;
 
to 影子:
Integer 怎么可以是一个字节?不是讲的inttostr().
用string 就不是这种做法了!
to 飘雪
如果那样,用TStrings不是很方便嘛。

var
s:=Tstrings;
i:integer;
begin
s:=TStringList.create;
s.loadfromfile(...);
for i:= 0 to s.count-1 do
begin
.....
s.strings:=s.strings+','+inttostr(..)+...
...
end;
s.savetofile(...);
s.free;

 
影子:
>>如果是以Integer的方式写入,只占一个byte,不可见。
你这种说法是不确切的!不能用byte来形容,要将文件换成16进制来看才能确定Integer占
的是几个字节(2或4)。

按照record方式来写的文件,不是一个纯粹的文本文件,从来record格式的文件写入和读取
的方式肯定是要相互匹配的。

maysally:
你所模拟的文件格式与数据库导出的应该是相同的,但是它不是我们通常所说的record格式
的记录文件,它只是一个文本文件。
在记录文件中,每条记录的每个项所占的存储空间是一定的。但是从数据库导出的文件在各
字段之间是通过逗号来分隔的,这是很明显的差异。


 
影子,
你給的代碼裡面
rec.CRLF[0] := #13;
rec.CRLF[1] := #10;
這兩行是回車換行吧,執行時顯示CRLF是undeclared identifier,
CRLF是什麼?我就注解掉了,但是不能換行。

jsxjd,
用TSTRINGS果然可以簡單的做,
那我要是想先去掉後面一個字段,再加上一個字段,
就是,你那樣是追加,如果要修改呢?

其實我用別的笨辦法做出來了,多謝兩位高手,請你們回答一下吧!
 
TO:jsxjd,maysally
sorry,本来打好的,因为IE出错重打。打得太快,打错了。Integer在32位机器上是4个byte。

TO:armyjiang
就我上面所写的代码生成的文件是文本文件,可以用TextFile读出的。
需要对读出的数据操作时,最好用相同的record读取了。

TO:maysally
我更改了记录格式,在上面的说明的。
//更改记录格式
TYPE TCHECK=RECORD
NAME: array [0..20] of char;
HOBBY: array [0..20] of char;
LNUMBER: array [0..10] of char;
CRLF: array [0..1]of char;
END;
CHECKFILETYPE=FILE OF TCHECK;

CRLF定义为数组,是回车换行,注销掉后当然不能回车换行了。

>>那我要是想先去掉後面一個字段,再加上一個字段,就是,你那樣是追加,如果要修改呢?

你的意思是修改吧?通过Strings[Index]赋值。


可以用特殊符号作分隔,例如",",但如果用文本编辑器打开时不好看。
不过,没必要保存为文本文件。
 
后退
顶部