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

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

maysally

Unregistered / Unconfirmed
GUEST, unregistred user!
我定義了一個記錄型文件checkfile,對應的是本地磁盤上一個文本文件'E:/TEMP/CC.TXT',
而且這個文件裡我錄入了內容:
rose,music,7
sally,skate,9
mike,sport,5
但是在程序中用Count := FileSize(CHECKFile)總是得到0,??
把文本文件assign為記錄型文件,對它的內容格式有什麼特別要求嗎?
部分代碼如下:
var
Form1: TForm1;
TYPE TCHECK=RECORD
NAME: STRING[20];
HOBBY: STRING[20];
LNUMBER: INTEGER;
END;
CHECKFILETYPE=FILE OF TCHECK;
implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
VAR
CHECKFILE: CHECKFILETYPE;
COUNT: INTEGER;
begin
ASSIGNFILE(CHECKFILE,'E:/TEMP/CC.TXT');
RESET(CHECKFILE);
Count := FileSize(CHECKFile);
知道請回答,謝謝!
 

应该不会是0。除非文件内容为空。
 
RESET(CHECKFILE,1); 看看
 
to影子:我就說了有內容阿,難道是將文本文件看做記錄型文件
在內容格式上有什麼特殊的要求嗎?
to pipi:
RESET(CHECKFILE,1)不行,編譯都不通過
 
这是因为你定义的记录类型 TCheck 和文件的内容根本不符。
文件中没有符合你定义的记录类型的数据。
INTEGER 应该是二进制的,怎么能在文本文件中表示呢。

把你定义的记录类型的后两个成员注释掉,返回值就不为 0 了:
TYPE TCHECK=RECORD
NAME: STRING[20];
////// HOBBY: STRING[20];
///// LNUMBER: INTEGER;
end;
 
FileSize(Var F ):Integer;

取得指定文件的文件长度。以字节为单位。如果F是一个记录文件,
filesize返回的是文件中的记录个数,实际的字节数可由记录数乘以记录长度获得。
filesize不能用于文本文件,调用该函数前,文件必须打开。
 

虽然是.TXT文件,但这并不是文本文件。
INTEGER不一定是二进制。
另外,STRING[20]写入记录时第一个就是20,这在文本文件中是不能显示的。
看看下面代码:

procedure TForm1.Button1Click(Sender: TObject);
VAR
CHECKFILE: CHECKFILETYPE;
COUNT: INTEGER;
begin
ASSIGNFILE(CHECKFILE,'E:/test.TXT');
RESET(CHECKFILE);
Count := FileSize(CHECKFile);
ShowMessage(IntToStr(count));
CloseFile(CHECKFILE);
end;

procedure TForm1.Button2Click(Sender: TObject);
VAR
CHECKFILE: CHECKFILETYPE;
rec: TCHECK;
i: integer;
begin
ASSIGNFILE(CHECKFILE,'E:/test.TXT');
REWRITE(CHECKFILE);
for i := 1 to 8 do
begin
rec.HOBBY := 'HOBBY'+IntToStr(i);
rec.LNUMBER := i+48;
rec.NAME := 'NAME'+IntToStr(i);
BlockWrite(CHECKFILE,rec,SizeOf(TCHECK));
end;
CloseFile(CHECKFILE);
end;
 
to 影 子:
INTEGER 在记录内部定义,不是二进制,是什么????????
你知道它占用几个字节??????????????

这里的问题就是定义和内容不符。
 
jsxjd,
我把TCHECK隻留了NAME一個字段,果然可以返回記錄數不是0,但是總是1,
我又恢復原來2個字段,並且把LNUMBER的類型改成STRING[2],
再用FILESIZE返回又是0!
真是搞不懂
我是想把一個有內容的TXT文件以記錄文件的形式讀出到STRINGGRID中顯示,
把TXT文件的一行內容看做記錄文件的一條記錄,
一行內容裡用逗號分開的看做是一條記錄的幾個字段,怎麼辦呢?
我現在的代碼如下:
var
Form1: TForm1;
TYPE TCHECK=RECORD
NAME: STRING[20];
HOBBY: STRING[20];
LNUMBER: STRING[2];
END;
CHECKFILETYPE=FILE OF TCHECK;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
VAR
CHECKFILE: CHECKFILETYPE;
COUNT,I: INTEGER;
METHODREC: TCHECK;
begin
ASSIGNFILE(CHECKFILE,'E:/TEMP/CC.TXT');
RESET(CHECKFILE);
Count := FileSize(CHECKFile); --------這裡就得到0
for i := 1 to Count do
begin
READ(CHECKFILE,METHODREC);
STRINGGRID1.Cells[1,I] :=METHODREC.NAME;
STRINGGRID1.Cells[2,I] :=METHODREC.HOBBY;
STRINGGRID1.Cells[3,I] :=METHODREC.LNUMBER;
end;
end;
 
影子,
TXT文件不是文本文件?
INNTEGER不是二進制?
'STRING[20]写入记录时第一个就是20,这在文本文件中是不能显示的',什麼意思?
我用你的BUTTON2CLICK試了一下,執行後文件沒有被寫入任何東西,好象不對吧?
 
不知道这个文件你是怎么形成的?看来是可以手工编辑而得到,那么此时你所用的记录方式
是错误的。
你可以尝试调整你的记录格式,然后类似这个文本文件一样去创建一个文件,结果文件中
所显示的格式与文本文件会有很大的差异!
记录文件和文本文件是两种不同结构的文件,不能如此合在一起使用。
 
這個文件我本來是應該從數據庫導出的,
這裡我是做測試用才自己輸入數值的,其實格式是一樣的。
不可以達到我想要的效果嗎?
我看到網上說任何類型的文件都可以看做是記錄型文件,為什麼TXT文件不可以呢?
 
你的目的是什么?就是要读出文件中的内容吗?要知道什么时候结束吗?

procedure TForm1.Button1Click(Sender: TObject);
VAR
CHECKFILE: TextFile;
COUNT: INTEGER;
s:string;
begin
ASSIGNFILE(CHECKFILE,'c:/CC.TXT');
RESET(CHECKFILE);
while not Eof(CHECKFILE) do
begin
Readln(CHECKFILE,s);
// 对读入的数据进行处理 //此处应换上你自己的过程
memo1.lines.add(s);
end;
CloseFile(CHECKFILE);

end;
 
to 飄雪,
不隻是讀出TXT文件的內容,否則我也不用去想什麼記錄型文件了,
因為我是從數據庫的TABLE中導出的文件,一條記錄一行,各個字段之間用逗號隔開
現在我想在每一行後面加上3個數字,也用逗號隔開。
我想用記錄文件和stringgrid是不是可以讓用戶看起來方便,還要查找某條記錄並更改
 
我用的就没有什么问题,不过我感觉DELPHI的这几个文件函数容易出问题
 
不要用string[...],string 的第一个字符是长度。而且跟编译选项有关。

name:array[0..20] of char ;
 
你的文件肯定不是用write(f, acheck);这样写进去的,格式没对准
 
收不到邮件通知,今天才看到。

To:jsxjd,maysally

>>TXT文件不是文本文件?

TXT文件默认是文本文件,但现在是你自定义的记录,文件扩展名只不过是你强加上去。
根本记录的定义,此文件不是文本文件。

>>INNTEGER不是二進制?

在计算机中什么都是二进制,但文本文件同样可以显示INTEGER的数据,只要ASCII码在48到57。

>>>>你知道它占用几个字节??????????????

32位机器上是4个byte,这也可以通过函数SizeOf得到。不单数字是二进制,数据的保存都可以看作是二进制。

>>'STRING[20]写入记录时第一个就是20,这在文本文件中是不能显示的',什麼意思?

在字符串数组中,写入数据时会先写入STRING[0],数值为20。ASCII码20是哪个字符?有意义吗?

>>我用你的BUTTON2CLICK試了一下,執行後文件沒有被寫入任何東西,好象不對吧?

由BlockWrite执行,一定会有数据的。除非哪里出错了。看看文件名,是 'E:/test.TXT'。再检查一下。

另外:
string[]比array of char好看一点吧。只要长度不超过255

To:张无忌

只要不操作指针,这几个函数就没问题。呵呵
 
to maysally
那你可以写一个过程或是函数,功能就是把一个串中以逗号分开的数据,
分别读出并赋予你的记录变量,
在用这个函数去把memo1.lines.add(s)行换掉。
要用到pos,copy两个函数
 
to 飘雪
Integer是 4 个字节的话,而且在文本文件中可见,
那么 123456 是整数吧,在文本文件中占几个字节。
其实他的这个问题很好解决,但他的方法主要还
在于:定义的记录类型和文件类型不符。
 
顶部