我做了ç打开文件来检查它是否是二进制的,如果是这样打印是二进制
我希望它打开文件并搜索一个词来只工作在文本文件
程序有没有用C提供一种方法来检查,如果是二进制文件,如果有的话,我会在任何操作发生
由于退出程序
我做了ç打开文件来检查它是否是二进制的,如果是这样打印是二进制
我希望它打开文件并搜索一个词来只工作在文本文件
程序有没有用C提供一种方法来检查,如果是二进制文件,如果有的话,我会在任何操作发生
由于退出程序
没有,没有,因为这是不可能的说清楚。如果您希望使用特定编码,您可以检查文件内容在此编码中是否有效,例如如果你期望ASCII,所有字节必须是< = 0x7f
。如果你期望UTF-8,它会更复杂一点,see a description of it。
在任何情况下,不能保证在任何给定的文本编码中“二进制”文件不会偶然看起来像一个有效的文件。事实上,术语“二进制文件”并没有太多意义,因为所有文件都包含二进制数据。
现在这似乎工作,我不指望在特殊符号上工作。我试图制作一个在Linux上像GREP一样工作的程序。 谢谢! –
这不是文件本身是二进制或文本;它只是关于如何在打开文件时解释文件的内容。 您可以将仅包含文本的文件解释为二进制文件,从而避免/r/n
可能仅翻译为/n
;您可以使用文本模式打开一个包含原始数据的文件,例如位图,因此可能会损坏内容,因为0x0D 0x0A
只能转换为0x0D
。
所以你不能检查文件本身,但你可以在二进制模式下打开文件,看看内容是否包含任何你不解释为文本。
void is_text(char *filename) {
FILE *f = fopen(filename, "r");
if (!f) {
perror("fopen failed");
return;
}
int c;
while ((c=fgetc(c) != EOF) {
if ((!isascii(c) || iscntrl(c)) && !isspace(c)) {
printf("is binary\n");
fclose(f);
return;
}
}
printf("is text\n");
fclose(f);
}
如果:
如果我们假设通过文本你的意思是ASCII而不是UTF-8,你可以通过阅读每个字符和使用isascii()
和isspace()
来检查它是否是一个有效的字符做文件包含UTF-8字符,它变得更加复杂,因为您必须一次查看多个字节并查看它们是否是有效的UTF-8字节序列。还有一个问题是,哪些Unicode代码点被视为文本。
我试图在Linux中模拟GREP的功能,我不认为它适用于unicode字符,所以我不认为这会是一个问题。谢谢你的帮助! –
取决于你的二进制文件是什么。检查文件isalphanum()中的每个字节还是大于127? –
所有文件都是二进制文件。 MS有区别,由于行结尾 –
检查文件结尾不会做诡计?或者,您可以检查可打印字符的ascii范围的字节。 – Tob