作者javafang (newJ)
看板C_and_CPP
标题[问题] fwrite与fread的问题
时间Sun Feb 1 01:21:23 2009
#include <stdio.h>
int main(int argc, char* argv[]) {
if(argc != 3) {
puts("指令: copy <input> <output>");
return 1;
}
FILE *file1 = fopen(argv[1], "rb");
FILE *file2 = fopen(argv[2], "wb");
if(!file1) {
puts("档案读入失败");
return 1;
}
if(!file2) {
puts("档案输出失败");
return 1;
}
char ch;
while(
!feof(file1)) {
fread(&ch, sizeof(char), 1, file1);
if(
!feof(file1)) {
fwrite(&ch, sizeof(char), 1, file2);
}
}
fclose(file1);
fclose(file2);
return 0;
}
这一个程式是用来复制档案的,
它是以byte为单位在复制,
但是,我困惑的是在执行最後一个回圈时,
fread读取最後一个byte,但if的内容没有执行,也就是说fwrite没有执行,
换句话说,来源的最後一个byte有读取出来,但是没有写入到目的档,
但是,最後来源档与目的档结果是一样的,一直搞不懂为什麽差一个byte还会一样?
先谢谢大家的指教
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 59.104.157.57
1F:推 WolfLord:改成 do看看 02/01 02:13
2F:推 fungi8210:因为最後一个fread完, file1 就到最後了.. 02/01 02:14
3F:→ WolfLord:另外这种动作用getc 跟 putc会不会比较好? 02/01 02:15
4F:→ COLDTURNIP:最後一次的 fread 读到的是 eof,传回 false。 02/01 03:34
5F:→ COLDTURNIP:更正,应该是说读到 0 个字元所以传回 0。 02/01 03:39
6F:推 QQting:不要用feof @@ 02/01 06:53
7F:推 suhorng:嗯 是feof()的问题 他会慢半拍 直接判断fread回传值就好Y 02/01 06:57
8F:→ javafang:在我测试之後,我认为在最後一次的fread是无效的,所以, 02/01 09:50
9F:→ javafang:因为它是读到eof,所以,整体来说fread与fwrite次数是相同 02/01 09:51
10F:→ javafang:另外,不直接判断fread的回传值是因为:对於二进位档案而 02/01 09:53
11F:→ javafang:若要判断档案是否到尾端,不能用读到-1来作判断,因为档 02/01 09:53
12F:→ javafang:案读取的过程中,可能就含有-1的值 02/01 09:53
13F:→ javafang:谢谢大家的指教 02/01 09:59
14F:推 suhorng:fread回传的是读到的element的数量 传回0时 就是档案结尾 02/01 10:16
15F:→ javafang:嗯,了解了,感谢suhorng指教 02/01 13:27