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

Posted

技术标签:

【中文标题】如何在c中读取二进制文件? (视频、图像或文本)【英文标题】:How to read a binary file in c? (video, images, or text) 【发布时间】:2011-01-19 09:46:39 【问题描述】:

我正在尝试将文件从指定库复制到当前目录。我可以完美地复制文本文件。任何其他文件都会损坏。程序在它应该检测到一个 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;

【问题讨论】:

【参考方案1】:

您需要将"b" 选项指定为fopen

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

没有它,文件将以文本 ("t") 模式打开,这会导致行尾字符的转换。

【讨论】:

【参考方案2】:

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

【讨论】:

【参考方案3】:

您使用的是 Windows 机器吗?尝试在对fopen 的调用中将“b”添加到模式字符串中。

来自 man fopen(3):

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

【讨论】:

以上是关于如何在c中读取二进制文件? (视频、图像或文本)的主要内容,如果未能解决你的问题,请参考以下文章

C/C++中如何将文件读取为二进制数据到数组中,再从数组中读取二进制流还原为文件,主要是后一步

如何使用C / C ++套接字从HTTP读取二进制文件

如何将图像保存和读取为文本,嵌入在代码中

C如何简单的读写文件?二进制文件如何读写?如何移动文件指针?

如何通过 C 中的 HTTP POST 请求发送图像或二进制数据

如何使用 C# 将 InkML 文件读取为图像或文本