确定文件是否包含二进制或ASCII数据

时间:2010-11-05 02:09:26

标签: c file-io ascii binary-data file-type

我将文件作为输入参数,我需要确定数据是否为二进制(我猜是ASCII或二进制),类似于* nix上的'file'命令,但在我的应用程序中

我不知道该怎么做,就像我在读数据时那样:

fread(&rndByte, sizeof(unsigned int), 1, fp);
// reading one unsigned int at a time from file fp

我正在考虑测试该值是否为< 128次,但不知道如何在一次读取整个int时测试这个。我虽然一次循环超过1个字节并检查这种方式,但我所使用的系统不喜欢我正在做的转变。

任何想法,建议?

3 个答案:

答案 0 :(得分:4)

  

我正在考虑测试是否有价值   是< 128

认为即使是英语文本也不会包含Basic Latin之外的字符,这是天真的。 Microsoft®程序尤其喜欢添加破折号 - 以及“智能引号”到文本。

更好的方法是查找ASCII控制字符。文本文件往往会有很多换行符(\n和/或\r,具体取决于平台),也许还有一些标签,但几乎不会有任何其他控制字符。

答案 1 :(得分:2)

正如其他人所说的那样(尽管不那么直率),在2010年将文本限制为ASCII是完全倒退的。由于非文本二进制数据解析为UTF-8的概率非常低,因此尝试解析的方法要好得多。整个文件为UTF-8,并在第一次失败时声明为二进制文件。

正如其他人所说,不是一次又一次地在小单位上调用freadfgetc,而是应该fread一次大块(1-4k)固定-size缓冲区并运行你的解析器,每当你到达终点时读取一个新的块。 (如果您的UTF-8解析器不容易重新启动,那么将memcpy缓冲区的末尾返回到开头可能是有意义的,并且只要缓冲区中剩下少于4个字节,就可以重新填充。)

答案 2 :(得分:1)

使用fread()获取整个1024字节(或512或任何适合您的工作)缓冲区,然后逐字节扫描该缓冲区,查找第8位设置的内容。这可能非常接近文件(1)的作用,除了文件(1)有更复杂的模式要考虑,它可能不会打扰这么大的缓冲区。

您还可以获取find的来源并了解其运作方式。