C語言 - 第三十八章 | 檔案 I/O - 二進位檔案 I/O
    二進位檔案 I/O
使用二進位模式開啟檔案,在寫入或讀取檔案時並不會發生字元轉換,數值在記憶體中的位元是如何,寫入檔案時就是如何,而讀入時也是相同。
要讀入二進位檔案,可以使用fread()函式,在讀寫時是使用位元組(byte)為單位的區塊(block)進行讀寫,所以也稱區塊I/O函式。
1
   | int fread(char *buffer, int size, int count, FILE *fp);
   | 
 
buffer參數為讀入的資料所要存放的地方。 
size是指讀入的每一筆資料長度(byte)。 
count是指讀入的筆數。 
對於二進位檔案而言,若要判斷檔案是否到尾端,不能用讀到-1來作判斷,因為檔案讀取的過程中,可能就含有-1的值,你可以使用 feof()函式來判斷是否到檔案結尾。
1 2 3
   | while(!feof(file)) {     .... }
  | 
 
下面這個程式可以讀入任意檔案,每次讀入一個位元組,並將讀入的資料以16進位數顯示。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
   | #include <stdio.h> 
  int main(int argc, char* argv[]) {     if(argc != 2) {          puts("指令: read <filename>");          return 1;      } 
      FILE *file = fopen(argv[1], "rb");     if(!file) {          puts("無法讀取檔案");          return 1;      } 
      unsigned char ch;      int count = 0; 
      while(!feof(file)) {          fread(&ch, sizeof(char), 1, file);
          printf("%2X ", ch);         count++;          if(count > 16) {               putchar('\n');             count = 0;          }      }      putchar('\n');
      fclose(file);
      return 0;  }
   | 
 
1 2 3 4 5 6
   |  78 6F 6A 64 6F 73 69 61 6C 64 6A 69 6F 31 6B 6C 32 65 31 30 39 38 37 79 68 6A 6E 6B 6A 73 64 69 6F 75 62 77 39 31 32 37 38 34 79 75 31 69 6A 77 6B 64 6C 6E 6D 73 20 6D 6B 6A 69 75 68 66 67 79 75 76 68 6A 63 6B 6E 6C 6C
 
  | 
 

如果要寫入檔案,可以使用fwrite()。
1
   | int fwrite(char *buffer, int size, int count, FILE *fp);
   | 
 
以下程式可以讓你將任意的檔案複製至另一個指定的名稱。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
   | #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;  }
   | 
 

註:以上參考了
二進位檔案 I/O