我需要编写C代码来检查文件是文本(ASCII)还是二进制
有人可以帮忙吗? 感谢
答案 0 :(得分:4)
典型的方法是读取前几百个字节并查找ASCII NUL。
如果文件包含NUL,它肯定是一个二进制文件。大多数二进制文件都包含NUL字节,但文本文件不应包含NUL字节。
#include <string.h>
bool is_binary(const void *data, size_t len)
{
return memchr(data, '\0', len) != NULL;
}
请注意,这是一种启发式方法。换句话说,有时会出错。
答案 1 :(得分:3)
读取所有字符并查看它们是否都是ASCII,即代码从0到127(包括0和127)。
某些工具通过检查文件是否包含代码为0的任何字节来确定文件是文本文件还是二进制文件。
显然,如果你应用这两种方法,你会得到一些文件的不同结果,所以,你必须定义你正在寻找的是什么。
答案 2 :(得分:0)
您可以使用libmagic。下面的代码将大致显示“文件”命令的执行方式。 (下面的代码又快又脏—可能需要清理。)
#include <string.h>
#include <magic.h>
#include <stdio.h>
//------------------------------------------------------------------------------
struct magic_set * prep_magic(int flags)
{
struct magic_set *magic = magic_open(flags);
const char *errstring;
int action = 0;
const char *magicfile = NULL;
if (magicfile == NULL)
magicfile = magic_getpath(magicfile, action);
if (magic == NULL)
{
printf("Can't create magic");
return NULL;
}
if (magic_load(magic, magicfile) == -1)
{
printf("%s", magic_error(magic));
magic_close(magic);
return NULL;
}
if ((errstring = magic_error(magic)) != NULL)
printf("%s\n", errstring);
return magic;
/* END FUNCTION prep_magic */ }
//------------------------------------------------------------------------------
int main(int argc, char **argv)
{
int flags = 0;
struct magic_set *msetptr = NULL;
const char *testfile = (char *)"/etc/motd";
msetptr = prep_magic(flags);
if( msetptr == NULL )
printf("no mset ptr\n");
const char *typer;
typer = magic_file( msetptr, testfile );
printf("typer = %s\n", typer );
return 0;
/* END PROGRAM */ }