如何在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”作为最后一个字符或作为上述任何两个字符串中的字符之间的字符。这完全是为了与 C89 兼容,没有任何效果; 'b' 在所有符合 POSIX 的系统上都被忽略,包括 Linux。 (其他系统可能会处理文本文件和二进制文件 文件不同,如果您执行 I/O,添加“b”可能是个好主意 到一个二进制文件,并期望您的程序可能被移植到非 Unix 环境。)
【讨论】:
以上是关于如何在c中读取二进制文件? (视频、图像或文本)的主要内容,如果未能解决你的问题,请参考以下文章
C/C++中如何将文件读取为二进制数据到数组中,再从数组中读取二进制流还原为文件,主要是后一步
C如何简单的读写文件?二进制文件如何读写?如何移动文件指针?