52.文件读取多一位的情况解决
- 用feof读取总是会多读取一位.
“C”语言的“feof()”函数和数据库中“eof()”函数的运作是完全不同的。数据库中“eof()”函数读取当前指针的位置,“C”语言的“feof()”函数返回的是最后一次“读操作的内容”。多年来把“位置和内容”相混,从而造成了对这一概念的似是而非。那么,位置和内容到底有何不同呢?举个简单的例子,比如有人说“你走到火车的最后一节车箱”这就是位置。而如果说“请你一直向后走,摸到铁轨结束”这就是内容。也就是说用内容来判断会“多走一节”。这就是完全依赖于“while(!feof(FP)){...}”进行文件复制时,目标文档总会比源文档“多出一些”的原因。 总结起来就是feof就是多走一节才能判断是不是到文件末尾,这样就会造成多读取一位.那么这样怎么处理呢?
如果是读写文本操作:
1 while (!feof(pf)) 2 { 3 char ch = fgetc(pf); 4 5 if (ch != -1) 6 { 7 fputc(ch, pf2); 8 } 9 }
如果是读写二进制操作:
1 fseek(pf, 0, SEEK_END);//文件指针移动到末尾(结束的位置) 2 int length = ftell(pf);//获取当前文件指针距离开头的长度 3 4 fseek(pf, 0, SEEK_SET);//移动当前文件指针到开头(开始的位置) 5 for (int i = 0; i < length; i++) 6 { 7 char ch = fgetc(pf); 8 fputc(ch, pf2); 9 }