如何仅通过使用C ++提供文件的路径来查找文件的幻数?

时间:2018-12-11 17:16:56

标签: c++ file file-handling

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

但是我遇到了“分段故障”

1 个答案:

答案 0 :(得分:3)

由于没有/root/ds/filehandling/a这样的文件,因此您遇到了分段错误,因此fopen失败了,但是您甚至从未检查它的返回值。 fp将是nullptr,并将其传递给fread之类的函数只是在乞求麻烦。

这个问题确实与幻数无关。如果您想在不知道其扩展名(即不知道其全名)的情况下打开文件,则必须look in its directory并通过模式匹配找到所需的文件。请注意,可能不仅只有一个;还可能只有一个。例如如果有一个文件a.txt和一个文件a.pdf,则必须决定为搜索项"a"选择哪个文件。

请记住,文件的“扩展名”只是文件名的最后一部分;这只是一个约定。许多文件甚至都没有这样的东西!

顺便说一句,别忘了fclose