您的位置:首页 > Web前端

关于使用函数feof的理解

2014-07-09 14:18 489 查看
#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。所以上面的想法是不行的。

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  feof