#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。所以上面的想法是不行的。