feof()为什么不能正确执行,他执行的机理是什么?程序如下

siyunying 2003-05-13 08:23:00
#include <iostream.h>
#include <stdio.h>
#include <process.h>
void main(int argc,char * argv[])
{
FILE * fin,*fout;
//check correctness of arguments
if(argc != 3)
{
printf("Arguments error\n");
exit(-1);
}
//open source file
if((fin=fopen(argv[1],"r"))==NULL)
{
printf("Can't open %s\n",argv[1]);
exit(-1);
}
//open object file
if((fout=fopen(argv[2],"w"))==NULL)
{
printf("Can's open %s\n",argv[2]);
exit(-1);
}
//copy file
while(!feof(fin))
putc(getc(fin),fout);

//close files
fclose(fin);
fclose(fout);
}

执行结果是:目标文件比原文件一个字节,十六制FF
这是为什么?请帮我详细解释一下。
...全文
102 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
fly_hyp 2003-05-13
  • 打赏
  • 举报
回复
因该这样写
char c;
while(TRUE)
{

if((c = getc(fin)) == EOF)
break;
//cout << (int)c << endl;
putc(c,fout);
}
fly_hyp 2003-05-13
  • 打赏
  • 举报
回复
EOF是文件的结束标志
end of file 就是文件指针指向文件的后面
getc
c++ builder中的定义
getc returns the next character(下一个字符) on the given input stream and increments the stream's file pointer to point to the next character.
On end-of-file or error, it returns EOF.

我认为在读取第一个字符之前
文件指针指向BOF(虽然c中没有)

当读取最后字符前
文件指针指向最后字符前面的字符
当读取最后字符后
文件指针指向最后字符









justaseeker 2003-05-13
  • 打赏
  • 举报
回复
eof feof都可以作为文件的结束标志,一般判断是与-1比较
lbaby 2003-05-13
  • 打赏
  • 举报
回复
feof(fin)是一个宏定义
feof(f) ((f)->flags & _F_EOF)
而FILE的定义如下:
typedef struct {
short level; /* fill/empty level of buffer */
unsigned flags; /* File status flags */
char fd; /* File descriptor */
unsigned char hold; /* Ungetc char if no buffer */
short bsize; /* Buffer size */
unsigned char *buffer; /* Data transfer buffer */
unsigned char *curp; /* Current active pointer */
unsigned istemp; /* Temporary file indicator */
short token; /* Used for validity checking */
} FILE;

也就是说
feof返回的只能是已经读出的文件内容(的性质),而不是没读出的下一个字符

只有当你读出了EOF,你才知文件已结束
而这时正如你的
while(!feof(fin))
putc(getc(fin),fout);

已多循环了一次

正如上边的朋友所说
你可以这样
char ch;
//...............
while( (ch = getc(fin) ) != EOF)
{
putc(ch,fout);
}
step_by_step 2003-05-13
  • 打赏
  • 举报
回复
这样容易判断文件是否结束
dragonlw 2003-05-13
  • 打赏
  • 举报
回复
对头
呵呵,努力学习
step_by_step 2003-05-13
  • 打赏
  • 举报
回复
EOF是文件的结束标志,一般定义成-1,因为-1没有对应的ascii
阿发伯 2003-05-13
  • 打赏
  • 举报
回复
c/c++文件流是先进行读写操作,再判断eof,所以,使用诸如:
while(!feof(f)) fprintf(f, ...); 会多显示一行,解决的办法是:
while(1)
{
if !feof(f) break;
.....
}
siyunying 2003-05-13
  • 打赏
  • 举报
回复
lbaby(花痴):
feof是宏,这一点使我找到理解这个问题的方向。

fly_hyp(大鹏):
getc的说明,对我有帮助。

有谁知道fopen,fgetc等文件操作函数的实现代码,我现在只知道VC的.



69,335

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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