二进制文件 I/O


使用二进制模式开启文件,在写入或读取文件时不会发生字符转换,数值在内存中的位是如何,写入文件时就是如何,而读入时也是相同。

要单纯地以二进制方式读取文件,可以使用fread函数,在读写时是使用字节为单位:

size_t fread( void* buffer, size_t size, size_t count, FILE* stream );

buffer参数为读入的数据所要存放的地方,size是指读入的字节长度,count是读入的笔数。

以二进制方式读取时,要判断文件是否到尾端,可以使用feof函数:

while(!feof(fp)) {
    ....
}

下面这个程序可以读入任意文件,每次读入一个字节,并将读入的数据以 16 进制数显示:

#include <stdio.h> 
#include <stdlib.h>

int main(int argc, char* argv[]) {
    FILE *fp = fopen(argv[1], "rb");
    if(!fp) { 
        perror("无法读取文件"); 
        return EXIT_FAILURE; 
    } 

    unsigned char ch; 
    int count = 0; 
    while(!feof(fp)) { 
        fread(&ch, sizeof(char), 1, fp);
        printf("%2X ", ch);
        count++; 
        if(count > 16) {  // 换行 
            putchar('\n');
            count = 0; 
        } 
    } 
    putchar('\n');

    fclose(fp);

    return 0; 
}

执行结果:

23 69 6E 63 6C 75 64 65 20 3C 73 74 64 69 6F 2E 68 
3E 20  A 20 20 20 20 20 20 20 20 20 20 20 20 20 20 
20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 
20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 
20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 
20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  A 69 
6E 74 20 6D 61 69 6E 28 69 6E 74 20 61 72 67 63 2C 
20 63 68 61 72 2A 20 61 72 67 76 5B 5D 29 20 7B  A 
20 20 20 20 69 66 28 61 72 67 63 20 21 3D 20 32 29
略...

如果要写入文件,可以使用fwrite

size_t fwrite( const void* buffer, size_t size, size_t count, FILE* stream );

下面这个程序可以让你将任意的文件复制至另一个指定的名称:

#include <stdio.h> 
#include <stdlib.h>

int main(int argc, char* argv[]) {  
    FILE *src = fopen(argv[1], "rb"); 
    FILE *dest = fopen(argv[2], "wb"); 

    if(!src) { 
        perror("来源文件开启失败"); 
        return EXIT_FAILURE; 
    } 

    if(!dest) { 
        perror("目标文件创建失败"); 
        return EXIT_FAILURE; 
    } 

    unsigned char ch; 
    while(!feof(src)) { 
        fread(&ch, sizeof(char), 1, src);
        if(!feof(src)) { 
            fwrite(&ch, sizeof(char), 1, dest);
        }
    } 

    fclose(src); 
    fclose(dest); 

    return 0; 
}

下面这个程序示范如何将数组数据写入文件,然后再将之读出:

#include <stdio.h> 
#include <stdlib.h>

int writeInts(int* arr, int len) {
    FILE *fp = fopen("temp", "wb");
    if(!fp) { 
        perror("无法读取文件"); 
        return EXIT_FAILURE; 
    } 
    fwrite(arr, sizeof(int) * len, 1, fp); 
    fclose(fp);
}

int readInts(int* arr, int len) {
    FILE *fp = fopen("temp", "rb"); 
    if(!fp) { 
        perror("无法读取文件"); 
        return EXIT_FAILURE; 
    } 

    fread(arr, sizeof(int) * len, 1, fp); 
    fclose(fp); 
}

int main(int argc, char* argv[]) {
    FILE *fp = fopen("temp", "wb");
    if(!fp) { 
        perror("无法读取文件"); 
        return EXIT_FAILURE; 
    } 

    const int len = 5;
    int arr[] = {1, 2, 3, 4, 5}; 

    writeInts(arr, len);
    readInts(arr, len);

    for(int i = 0; i < 5; i++) {
        printf("%d ", arr[i]); 
    }
    putchar('\n');

    return 0; 
}




展开阅读全文