2012-04-19 158 views
3

如何读取c/C++中不是简单文本文件的文件的内容?例如,我想读取.jpg/.png/.bmp等图像文件并查看某个索引处的值,以检查它是什么颜色?或者如果我有.exe/.rar/.zip并且想知道在不同索引处存储了什么值? 我知道空调风格的阅读文件,这是读取“.txt”文件以外的文件内容

FILE *fp; 

fp = fopen("example.txt","r"); /* open for reading */ 

char c; 

c = getc(fp) ; 

我想知道如果我取代“example.txt中”与“image.png”左右的时间,将它的工作原理?我会得到正确的数据吗?

+3

*阅读*任何类型的文件没有什么不同。只*解释*你读的是不同之处。 – 2012-04-19 06:00:35

+0

+1好问题......... !! – 2012-04-19 06:26:44

+0

谢谢@Als。 – 2012-04-19 07:17:07

回答

2

您需要以二进制模式打开文件。这使您可以在“原始”模式下读取字节,并与文件中的内容保持一致。

但是,确定特定像素的颜色等需要您充分理解文件中字节的含义以及它们如何排列以便读取文件。第二个要求更困难。您需要对该文件类型的格式进行一些研究才能做到这一点。

+0

我有这样的想法.bmp是未压缩的文件,因此像素颜色数据按顺序排列。这是真的? – 2012-04-19 06:59:44

+1

@someone_smiley虽然.bmp是未压缩的,但它仍然是一种格式。维基百科关于这个主题有一些[info](http://en.wikipedia.org/wiki/BMP_file_format)。 – 2012-04-19 08:15:13

8

当你打开一个非文本文件,你要指定二进制(未)模式:

FILE *fp = fopen("example.png", "rb"); 

在典型情况下,你做最你的阅读从二进制文件的定义结构是镜像文件中的结构,然后使用fread从文件中读入结构中(但必须小心谨慎,以确保结构中的填充等内容在内存中的表示和内存中的内容之间没有差异)磁盘)。

+0

谢谢你回答:)。所以“rb”模式需要打开所有其他扩展名,我必须小心数据格式的权利?将不胜感激,如果你可以更详细地阐述“定义文件中镜像结构的结构”,我不理解术语“镜像结构” – 2012-04-19 07:14:51

1

是的,你可以打开任何文件binary mode在c。如果你有兴趣,那么你也可以阅读任何这样的非文本文件的第一个字节。

在大多数情况下,所有不同的文件格式都有一些固定的标题,因此您可以确定该文件的类型。

打开任何的Matroska(.MKV)文件,并读1日的4字节,你将永远有这个

0x1A 0x45 0xDF 0xA3 

你也可以看到任何文件中的二进制表示在Linux hexdump实用

==== ================ 编辑:

such as .jpg/.png/.bmp and see the value at certain index,to 
check what colour it is? 

在这里你需要了解的格式Ø f该文件,并基于这一点,你可以知道哪些地方的数据是什么信息显示.. !!!

+0

谢谢你的启发:) – 2012-04-19 07:01:11