关于文件的读取的一个问题

netying 2003-03-18 01:52:06
FILE *fp;
unsigned char c;
AnsiString hexstr="";

fp=fopen("d:\\documents\\ttt.txt","rb");
while(!(feof(fp)))
{
c=fgetc(fp);
hexstr+=AnsiString(IntToHex(c,2));
}

这样一段代码,用来读取一个文件,然后转换成16进制方式,赋给hexstr

问题是:为什么结果hexstr末尾多出来了个"FF"?
...全文
20 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
netying 2003-03-18
  • 打赏
  • 举报
回复
谢谢,明白了,看来feof(fp)这个东西不能用
在我眼里,文件并没有文本和二进制的区别

另:do{}while()我用了,一样的,也是多一个FF出来
jishiping 2003-03-18
  • 打赏
  • 举报
回复
fseek这个函数是移动文件指针,不是判断文件是否结束。如果文件不存在,fopen()就会返回
NULL,或者文件被其它程序打开(非共享打开的),那么fopen()也返回NULL。
yesry 2003-03-18
  • 打赏
  • 举报
回复
不要while(){}
要do{}while();
jishiping 2003-03-18
  • 打赏
  • 举报
回复
“那么下边两段代码应该效果一样吧?”

上面已经说的很清楚了,对于文本文件来说一样,但是对于二进制文件来说,就不一样了。
二进制文件不能用feof判断。
netying 2003-03-18
  • 打赏
  • 举报
回复
那多谢谢了!看来用第二种方法是通用的了
那么fp什么时候会等于NULL?就是说fseek这个函数如何判断文件末尾?
jishiping 2003-03-18
  • 打赏
  • 举报
回复
作为一个好的习惯,在使用fopen()函数时,需要判断返回的文件指针是否为0,如果为0,
表示打开文件失败。如果此时使用其他函数读取文件,会造成程序死掉。所以需要fopen()
的返回值是否为NULL。
netying 2003-03-18
  • 打赏
  • 举报
回复
如果feof(fp)可以正确判断文件的末尾,那么下边两段代码应该效果一样吧?
另外FF真的可以表示文件末尾么??

===================================================
while(1)
{
c=fgetc(fp);
if (feof(fp)) break;
hexstr+=AnsiString(IntToHex(c,2));
}
=================================================
fp=fopen("d:\\documents\\ttt.txt","rb");
if (fp != NULL) {
fseek(fp, 0, SEEK_END); //移到文件末尾
int nSize = ftell(fp); //取得文件长度
fseek(fp, 0, SEEK_SET); //移到文件开头
while(nSize-- > 0)
{
c = fgetc(fp);
hexstr+=AnsiString(IntToHex(c,2));
}
fclose(fp);
}
jishiping 2003-03-18
  • 打赏
  • 举报
回复
就是 fyje(无言相对) 说的,是文件结束符,使用feof判断时,必须读到文件结束符(就是FF)
时feof(fp)才返回TRUE,所以如果是二进制文件,且中间有FF字符的话,用feof判断的话就会
发生读不完就结束。所以对二进制文件的读取,不能使用feof判断文件是否结束。对于文本文
件时,使用fgetc读的话,最后就会读到一个FF(表示文件结束),然后feof才返回TRUE。所
以如果非要象你开始那样写的,就必须先读字符,再判断。如果是FF字符,就退出循环。
netying 2003-03-18
  • 打赏
  • 举报
回复
那是不是说feof并不能真正判断一个文件的末尾?
netying 2003-03-18
  • 打赏
  • 举报
回复
to jishiping:你这段看来不错,我试一下,谢谢,
同时希望你能否解释一下我那段代码为什么会这样?
jishiping 2003-03-18
  • 打赏
  • 举报
回复
有区别,一个是先判断再读,一个是先读再判断。
netying 2003-03-18
  • 打赏
  • 举报
回复
TO 小虫:是空格,但是文件中本身并没有这个内容的
jishiping 2003-03-18
  • 打赏
  • 举报
回复
有的文件中间也有FF这样的值啊!那还如何区分文件是否结束?

这样写:
fp=fopen("d:\\documents\\ttt.txt","rb");
if (fp != NULL) {
fseek(fp, 0, SEEK_END); //移到文件末尾
int nSize = ftell(fp); //取得文件长度
fseek(fp, 0, SEEK_SET); //移到文件开头
while(nSize-- > 0)
{
c = fgetc(fp);
hexstr+=AnsiString(IntToHex(c,2));
}
fclose(fp);
}
netying 2003-03-18
  • 打赏
  • 举报
回复
请问jishiping,你这段代码和我那段好象没有区别啊
weibz0525 2003-03-18
  • 打赏
  • 举报
回复
FF==255==空格符
jishiping 2003-03-18
  • 打赏
  • 举报
回复
while(1)
{
c=fgetc(fp);
if (feof(fp)) break;
hexstr+=AnsiString(IntToHex(c,2));
}
netying 2003-03-18
  • 打赏
  • 举报
回复
可是有的文件中间也有FF这样的值啊!那还如何区分文件是否结束?
fyje 2003-03-18
  • 打赏
  • 举报
回复
文件结束符

13,825

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧