【问题标题】:Reading the content of file other than ".txt" file读取“.txt”文件以外的文件内容
【发布时间】:2012-04-30 15:12:45
【问题描述】:

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

FILE *fp;

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

char c;

c = getc(fp) ;

我想知道如果我将“example.txt”替换为“image.png”左右,它会起作用吗?我会得到正确的数据吗?

【问题讨论】:

  • 阅读任何类型的文件都不例外。只有解读你所读的内容是不同的。

标签: c++ c file-handling


【解决方案1】:

是的,您可以在 c 中打开 binary mode 中的任何文件。如果您有兴趣,那么您还可以阅读任何此类非文本文件的第一个字节。

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

打开任何 matroska(.mkv) 文件并读取第一个 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?

这里你需要了解那个文件的格式,然后你就可以知道在哪个地方的数据上表明了什么信息..!!!

【讨论】:

  • 谢谢你的启发:)
【解决方案2】:

当您打开一个非文本文件时,您需要指定二进制(未翻译)模式:

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

在典型情况下,您通过定义镜像文件中结构的结构来从二进制文件中读取大部分内容,然后使用fread 从文件中读取到结构中(但这必须小心完成, 以确保结构中的填充等内容在内存中和磁盘上的表示之间没有区别)。

【讨论】:

  • 感谢您的回答:)。所以“rb”模式需要打开所有其他扩展,我必须小心数据格式对吗?如果您能详细说明“定义镜像文件中结构的结构”,我将不胜感激,我不理解“镜像结构”这个术语
【解决方案3】:

您需要以二进制模式打开文件。这允许您以“原始”模式读取字节,其中它们与文件中的内容保持不变。

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

【讨论】:

  • 我发现 .bmp 是未压缩文件,因此像素颜色数据是按顺序排列的。这是真的吗?
  • @someone_smiley 虽然 .bmp 未压缩,但它仍有一种格式。维基百科有一些关于这个主题的info
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-02-02
  • 2014-06-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-26
  • 1970-01-01
相关资源
最近更新 更多