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