小小的 copy 大大的學問
平常都是直接在電腦上寫程式,結果面試的時候要在紙上寫,還真的寫不太出來。因為都習慣線上查資料,所以參數都沒有背,所以拿回家 compiler 後果然一堆錯誤,不是參數位置放錯,不然就是個數不正確。
以下是修改過的版本,錯誤檢查是一定要的,比較特別的是 fread 跟 fwrite 的第 2 & 3 個參數,其中第 2 個參數是 size,第 3 個參數是個數,而傳回值是成功讀取或寫入的個數而非 size。我原本的寫法是
length = fread(buf, sizeof(buf),1, fp)
成功時 length = 1,但最後一筆不滿 buf size 的就讀不到了,所以才改成
length = fread(buf, 1, sizeof(buf), fp)
這樣 length 就傳回實際讀到的長度了,不過不曉得有沒有影響效能就是了
以下是修改過的版本,錯誤檢查是一定要的,比較特別的是 fread 跟 fwrite 的第 2 & 3 個參數,其中第 2 個參數是 size,第 3 個參數是個數,而傳回值是成功讀取或寫入的個數而非 size。我原本的寫法是
length = fread(buf, sizeof(buf),1, fp)
成功時 length = 1,但最後一筆不滿 buf size 的就讀不到了,所以才改成
length = fread(buf, 1, sizeof(buf), fp)
這樣 length 就傳回實際讀到的長度了,不過不曉得有沒有影響效能就是了
#include <stdio.h> #include <stdlib.h> int main(int argc, char *argv[]) { if (argc != 3) { printf("Usage:\n"); printf(" my_copy [source file] [dest file]\n"); return 0; } FILE *fp; fp = fopen(argv[1], "r"); if (!fp) { printf("%s file open error.\n", argv[1]); return 0; } FILE *fpw = fopen(argv[2], "w"); if (!fpw) { printf("%s file open error.\n", argv[2]); fclose(fp); return 0; } char buf[1024]; int length; while ((length = fread(buf, 1, sizeof(buf), fp)) != 0) { fwrite(buf, 1, length, fpw); } fclose(fp); fclose(fpw); return 0; }
留言