C打开文件以检查它是否为二进制,如果是,则打印为二进制

时间:2017-10-20 13:31:05

标签: c file-io gnu

我制作了一个打开文件并搜索单词的程序

我希望它只适用于TEXT文件

C是否有办法检查文件是否为BINARY,如果是,我想在任何操作发生之前退出程序

由于

4 个答案:

答案 0 :(得分:2)

不,没有,因为无法确定。如果您希望使用特定编码,则可以自行检查文件内容在此编码中是否有效,例如如果您期望ASCII,则所有字节必须为< = 0x7f。如果你期望UTF-8,那就更复杂了see a description of it

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

答案 1 :(得分:1)

文件本身不是二进制文本或文本文件;它只是关于在打开文件时如何解释文件的内容。 您可以将仅包含文本的文件解释为二进制文件,从而避免/n只能转换为0x0D 0x0A;并且您可以使用文本模式打开包含原始数据的文件,例如位图,从而可能损坏内容,因为0x0D仅转换为if

因此您无法检查文件本身,但您可以以二进制模式打开文件,并查看内容是否包含您未解释为文本的任何内容。

答案 2 :(得分:1)

如果我们假设你的文字是指ASCII而不是UTF-8,你可以通过阅读每个字符并使用isascii()isspace()检查它是否是有效字符来实现:

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);
}

如果文件包含UTF-8字符,则它变得更加复杂,因为您必须同时查看多个字节并查看它们是否是有效的UTF-8字节序列。还有一个问题是哪些Unicode代码点被视为文本。

答案 3 :(得分:0)

也许:system(文件“路径/文件名”);