2017-10-20 105 views
0

我做了ç打开文件来检查它是否是二进制的,如果是这样打印是二进制

我希望它打开文件并搜索一个词来只工作在文本文件

程序

有没有用C提供一种方法来检查,如果是二进制文件,如果有的话,我会在任何操作发生

由于退出程序

+0

取决于你的二进制文件是什么。检查文件isalphanum()中的每个字节还是大于127? –

+0

所有文件都是二进制文件。 MS有区别,由于行结尾 –

+0

检查文件结尾不会做诡计?或者,您可以检查可打印字符的ascii范围的字节。 – Tob

回答

1

没有,没有,因为这是不可能的说清楚。如果您希望使用特定编码,您可以检查文件内容在此编码中是否有效,例如如果你期望ASCII,所有字节必须是< = 0x7f。如果你期望UTF-8,它会更复杂一点,see a description of it

在任何情况下,不能保证在任何给定的文本编码中“二进制”文件不会偶然看起来像一个有效的文件。事实上,术语“二进制文件”并没有太多意义,因为所有文件都包含二进制数据。

+0

现在这似乎工作,我不指望在特殊符号上工作。我试图制作一个在Linux上像GREP一样工作的程序。 谢谢! –

1

这不是文件本身是二进制或文本;它只是关于如何在打开文件时解释文件的内容。 您可以将仅包含文本的文件解释为二进制文件,从而避免/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); 
} 

如果:

1

如果我们假设通过文本你的意思是ASCII而不是UTF-8,你可以通过阅读每个字符和使用isascii()isspace()来检查它是否是一个有效的字符做文件包含UTF-8字符,它变得更加复杂,因为您必须一次查看多个字节并查看它们是否是有效的UTF-8字节序列。还有一个问题是,哪些Unicode代码点被视为文本。

+0

我试图在Linux中模拟GREP的功能,我不认为它适用于unicode字符,所以我不认为这会是一个问题。谢谢你的帮助! –

相关问题