代码之家  ›  专栏  ›  技术社区  ›  Collin Price

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

  •  7
  • Collin Price  · 技术社区  · 14 年前

    我正在尝试将文件从指定的库复制到当前目录。我可以完美地复制文本文件。任何其他文件都会损坏。程序检测到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 回复  |  直到 13 年前
        1
  •  18
  •   Hans W    14 年前

    你在Windows电脑上吗?尝试将“b”添加到调用中的模式字符串 fopen .

    来自Man Fopen(3):

    模式字符串还可以包括字母“b”,作为最后一个字符或作为上述任意两个字符串中字符之间的字符。这完全是为了与C89兼容,没有任何影响;在所有符合POSIX的系统(包括Linux)上,“b”都被忽略。(其他系统可以处理文本文件和二进制文件 文件不同,如果您执行I/O,添加“b”可能是一个好主意。 到二进制文件,并期望您的程序可以移植到非UNIX 环境。
        2
  •  5
  •   Thomas    14 年前

    您需要指定 "b" 选择 fopen :

    source = fopen("./library/rfc1350.txt", "rb");
    ...
    destination = fopen("rfc1350.txt", "wb");
    

    如果没有它,文件将以文本形式打开( "t" )模式,这将导致行末字符的翻译。

        3
  •  2
  •   user200783    14 年前

    您需要以二进制格式而不是文本格式打开文件。在你的电话里 fopen 使用 "rb" "wb" 而不是 "r" "w" 分别。