C 打开文件检查它是否是二进制文件,如果是则打印它是二进制文件
C Opening a file to check if it is Binary, if so print it is binary
我制作了一个打开文件并搜索单词的程序
我希望它只适用于文本文件
C 是否提供了一种方法来检查文件是否为二进制文件,如果是,我想在任何操作发生之前退出程序
谢谢
不,没有,因为无法确定。如果您需要特定的编码,您可以自己检查文件内容在此编码中是否有效,例如如果您需要 ASCII,所有字节必须 <= 0x7f
。如果你期望UTF-8,那就有点复杂了,see a description of it.
在任何情况下,都不能保证 "binary" 文件不会意外地看起来像任何给定文本编码的有效文件。事实上,术语 "binary file" 并没有太大意义,因为所有文件都包含二进制数据。
文件本身不是二进制或文本;它只是关于打开文件时如何解释文件的内容。
您可以将仅包含文本的文件解释为二进制文件,从而避免 /r/n
可能仅被翻译为 /n
;你可能会打开一个包含原始数据的文件,例如,使用文本模式的位图,从而可能破坏内容,因为 0x0D 0x0A
仅转换为 0x0D
。
因此您无法检查文件本身,但您可以以二进制模式打开文件并查看内容是否包含您不解释为文本的任何内容。
如果我们假设您所说的文本是指 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 代码点被视为文本。
也许:系统(文件“path/filename”);
我制作了一个打开文件并搜索单词的程序
我希望它只适用于文本文件
C 是否提供了一种方法来检查文件是否为二进制文件,如果是,我想在任何操作发生之前退出程序
谢谢
不,没有,因为无法确定。如果您需要特定的编码,您可以自己检查文件内容在此编码中是否有效,例如如果您需要 ASCII,所有字节必须 <= 0x7f
。如果你期望UTF-8,那就有点复杂了,see a description of it.
在任何情况下,都不能保证 "binary" 文件不会意外地看起来像任何给定文本编码的有效文件。事实上,术语 "binary file" 并没有太大意义,因为所有文件都包含二进制数据。
文件本身不是二进制或文本;它只是关于打开文件时如何解释文件的内容。
您可以将仅包含文本的文件解释为二进制文件,从而避免 /r/n
可能仅被翻译为 /n
;你可能会打开一个包含原始数据的文件,例如,使用文本模式的位图,从而可能破坏内容,因为 0x0D 0x0A
仅转换为 0x0D
。
因此您无法检查文件本身,但您可以以二进制模式打开文件并查看内容是否包含您不解释为文本的任何内容。
如果我们假设您所说的文本是指 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 代码点被视为文本。
也许:系统(文件“path/filename”);