关于使用函数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函数使用的说明
- stm32中关于NVIC_SetVectorTable函数使用的疑惑与理解
- 自己关于指针在函数中使用的理解和总结
- 关于使用fseek函数之后feof函数无法结束文件的警告 http://bbs.csdn.net/topics/390759596
- 关于AO和AE中使用小问题(新手理解)
- __atribute__使用:关于_attribute__ ((used,__section__(".xxxx")))的理解
- 关于C++中函数指针的使用(包含对typedef用法的讨论)
- 关于C++中函数指针的使用(包含对typedef用法的讨论)
- 关于使用Perl map函数和命令行解析的技巧
- 关于FGETS()函数的使用
- sqlserver关于函数中如何使用Getdate()(转贴)
- 关于fopen函数中路径名使用字符串的一点看法
- 关于header()函数的使用
- 关于javascript无法使用XPath的函数功能的解决方法
- 关于feof函数的bug问题
- 关于 Delphi 中流的使用(8) 压缩与解压缩的函数
- 关于C++中函数指针的使用
- 关于C++中函数指针的使用(包含对typedef用法的讨论)
- 关于C++中函数指针的使用(包含对typedef用法的讨论)
- 关于Delphi中流的使用-压缩与解压缩的函数