我制作了一个打开文件并搜索单词的程序
我希望它只适用于TEXT文件
C是否有办法检查文件是否为BINARY,如果是,我想在任何操作发生之前退出程序
由于
答案 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(文件“路径/文件名”);