如何在C语言中读取二进制文件?(视频、图像或文本)

8

我正在尝试将一个指定库中的文件复制到当前目录。我可以完美地复制文本文件,但是其他类型的文件会损坏。程序在应该之前检测到了文件结束符(feof)。

#include <stdio.h>

int BUFFER_SIZE = 1024;
FILE *source;
FILE *destination;
int n;
int count = 0;
int written = 0;

int main() {
    unsigned char buffer[BUFFER_SIZE];

    source = fopen("./library/rfc1350.txt", "r");

    if (source) {
        destination = fopen("rfc1350.txt", "w");

        while (!feof(source)) {
            n = fread(buffer, 1, BUFFER_SIZE, source);
            count += n;
            printf("n = %d\n", n);
            fwrite(buffer, 1, n, destination);
        }
        printf("%d bytes read from library.\n", count);
    } else {
        printf("fail\n");
    }

    fclose(source);
    fclose(destination);

    return 0;
}
3个回答

19

你正在使用Windows机器吗?尝试在对fopen的调用中的模式字符串中添加"b"。

从man fopen(3)中可以看到:

模式字符串也可以包含字母“b”,可以作为最后一个字符或出现在上述任意两个字符字符串中间的字符。这仅仅是为了与C89兼容,没有实际作用;'b'在所有遵循POSIX标准的系统上都被忽略,包括Linux。(其他系统可能会以不同方式处理文本文件和二进制文件,如果您要读写二进制文件并期望程序可以移植到非Unix环境中,添加'b'可能会是个好主意。)


6
您需要在fopen函数中指定"b"选项:
source = fopen("./library/rfc1350.txt", "rb");
...
destination = fopen("rfc1350.txt", "wb");

没有指定模式时,文件会以文本("t")模式打开,这会导致换行符的转换。

3

您需要以二进制格式而不是文本格式打开文件。在调用fopen时,分别使用"rb""wb"而不是"r""w"


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接