Like Share Discussion Bookmark Smile

J.J. Huang   2019-12-05   C   瀏覽次數:

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