2017-10-20 106 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字符,所以我不認爲這會是一個問題。謝謝你的幫助! –

相關問題