int main()
{
FILE *fp = fopen("/root/ds/filehandling/a.pdf", "rb");
unsigned char magic[4];
fread((void *)magic, 1, 4, fp);
cout << hex << "magic:";
for (int i = 0; i < 4; i++)
cout << " 0x" << int(magic[i]);
cout << dec << endl;
return 0;
}
这里的问题是我必须指定扩展名,然后才可以得到幻数,但是我的目标是在不提供扩展名的情况下指定文件名,以便在比较幻数时可以确定其类型。
这就是我想要的:
int main() {
FILE *fp = fopen("/root/ds/filehandling/a", "rb");
unsigned char magic[4];
fread((void *)magic, 1, 4, fp);
cout << hex << "magic:";
for (int i = 0; i < 4; i++)
cout << " 0x" << int(magic[i]);
cout << dec << endl;
return 0;
}
输出:魔术:0x25 0x50 0x44 0x46
但是我遇到了“分段故障”
答案 0 :(得分:3)
由于没有/root/ds/filehandling/a
这样的文件,因此您遇到了分段错误,因此fopen
失败了,但是您甚至从未检查它的返回值。 fp
将是nullptr
,并将其传递给fread
之类的函数只是在乞求麻烦。
这个问题确实与幻数无关。如果您想在不知道其扩展名(即不知道其全名)的情况下打开文件,则必须look in its directory并通过模式匹配找到所需的文件。请注意,可能不仅只有一个;还可能只有一个。例如如果有一个文件a.txt
和一个文件a.pdf
,则必须决定为搜索项"a"
选择哪个文件。
请记住,文件的“扩展名”只是文件名的最后一部分;这只是一个约定。许多文件甚至都没有这样的东西!
顺便说一句,别忘了fclose
。