作者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