关于使用函数feof的理解

#include <stdio.h>
#include <stdlib.h>
int main()
{
	FILE *in, *out;
	char ch, infile[10], outfile[10];
	printf("输入读入文件的名字:");
	scanf("%s", infile);
	printf("输入输出文件的名字:");
	scanf("%s", outfile);
	if ((in = fopen(infile, "r")) == NULL)
	{
		printf("无法打开此文件\n");
		exit(0);
	}
	if ((out = fopen(outfile, "w")) == NULL)
	{
		printf("无法打开此文件\n");
		exit(0);
	}
	while (!feof(in))//判断文件是否读取结束
	{
		ch = fgetc(in);
		fputc(ch, out);
		putchar(ch);
	}
	putchar(10);
	fclose(in);
	fclose(out);
	return 0;
}


文件tmp4的内容为123

读取文件tmp4,写到tmp5中

首先看下文件

<182 mdsp209 [mct] :/home/mdcc/mct/cpp>ls -l tmp4 tmp5
-rw-r----- 1 mct users 4 Jul  9 10:37 tmp4
-rw-r----- 1 mct users 5 Jul  9 10:37 tmp5

tmp4中4个字节,tmp5中5个字节,文件大小不一致?

<183 mdsp209 [mct] :/home/mdcc/mct/cpp>cat -A tmp4
123$
<184 mdsp209 [mct] :/home/mdcc/mct/cpp>cat -A tmp5
123$
M-^?<185 mdsp209 [mct] :/home/mdcc/mct/cpp>

cat命令查看后发现tmp5文件后有一个东东

<174 mdsp209 [mct] :/home/mdcc/mct/cpp>od -h tmp4
0000000 3231 0a33                                                              这里是16进制显示,且2个字节一组,且是小段显示实际对应123换行符
<175 mdsp209 [mct] :/home/mdcc/mct/cpp>od -h tmp5
0000000 3231 0a33 00ff

使用od命令查看多出了00ff

 

问题的原因是因为上述代码拷贝文件时多拷贝了一点内容

在判断文件结束时逻辑出错。

要搞清楚feof函数是用于检测流上的文件结束符标识是否被设置的,没有设置返回0,设置返回非0


假设文件里的内容为1

那么上述代码执行时是

先用feof去检测检测流上的文件结束符标,结果没有被设置

读取内容1写到另一个文件中

又用feof去检测检测流上的文件结束符标,结果没有被设置

读取文件,此时文件已经没有内容可读,fgetc()返回EOF,设置流上的文件结束符标,把EOF写到另一个文件中,EOF即为-1,16进制为0xff

又用feof去检测检测流上的文件结束符标,结果有被设置,跳出循环。

所以代码

while (!feof(in))//判断文件是否读取结束
	{
		ch = fgetc(in);
		fputc(ch, out);
		putchar(ch);
	}


使用是错误的。

正确的应该为

ch = fgetc(in);//先读取
while (!feof(in))//再判断文件是否读取结束
	{
		fputc(ch, out);
		putchar(ch);
		ch = fgetc(in);
	}

那么如果使用fgetc()读取的内容作为判断文件是否结束的依据是否可以呢?

fgetc()函数返回来自stream(流)中的下一个字符,如果到达文件尾或者发生错误时返回EOF,注意这里EOF就是-1,ascii文件的话是不会有-1的,

但是如果是一个二进制文件的话,可能内容中就包含了-1。所以上面的想法是不行的。


 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值