我做了ç打開文件來檢查它是否是二進制的,如果是這樣打印是二進制
我希望它打開文件並搜索一個詞來只工作在文本文件
程序有沒有用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