Wednesday, December 28, 2011

檔案讀取的兩種方法

檔案讀取的方法有很多種,列出兩個我平常在用的方法,以複製argv[1]位置的檔案內全部內容到argv[2]位置的檔案為例。


  1. 使用fscanf/fprintf:先定義FILE指標*fin, *fout指到檔案,之後使用fscanf/fprintf時,把fin/fout當作第一個參數,而第二個、第三個分別與scanf/printf的第一個、第二個相同。
    #include 
    
    int main(int argc, char *argv[]){
    
     // define fin, fout as a FILE pointer
     FILE *fin = fopen(argv[1], "r"),
       *fout= fopen(argv[2], "w");
    
     // copy whatever in the fin to fout
     char c;
     while(fscanf(fin, "%c", &c) != EOF){
      fprintf(fout, "%c", c);
     }
    
     fclose(fin);
     fclose(fout);
    
     return 0;
    }
    
  2. 使用freopen:此時我們把原本的鍵盤輸入輸出(standard input/output, or stdin/sdtout)改成檔案的輸入輸出,於是乎之後的所有print, scanf會直接輸入/輸出到檔案。
    #include 
    
    int main(int argc, char *argv[]){
    
     // redirect stdin/stdout to file read/write
     freopen(argv[1], "r", stdin);
     freopen(argv[2], "w", stdout);
    
     // copy everything
     char c;
     while(scanf("%c", &c) != EOF){
      printf("%c", c);
     }
    
     return 0;
    }
    
討論:
  • 第一種方法(fscanf/fprintf)執行起來比較沒有效率,因為每一次都要透過FILE指標,找對應的檔案。
  • 第二種方法執行過freopen就沒有辦法再使用stdin/stdout的printf/scanf了。