【问题标题】:How to find the magic number of a file by just provding the path of the file using c++?如何仅通过使用 C++ 提供文件的路径来找到文件的幻数?
【发布时间】:2018-12-11 17:16:56
【问题描述】:
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

但我收到“分段错误”

【问题讨论】:

  • 那么,你想指定a作为文件名并得到a.pdf作为打开的文件吗?如果目录中也存在 a.txt,您希望发生什么?
  • 如果可能,读取两个文件的幻数
  • 我不明白你想要什么。请花点时间问一个更好的问题。例如,您可以向我们提供所需的用户代码和预期的输出/副作用。示例:“我调用 get_magic("/path/a") 将返回文件名列表和关联的幻数,文件的幻数是......”
  • 您没有在问题的任何地方提供文件类型。扩展名不是文件类型,它只是文件名的一部分。
  • “扩展名”部分 (.pdf) 只是文件名的一部分,除了按照约定外,没有说明文件的内容。您无法打开没有其全名的文件,因此您想要做的事情是不可能的。

标签: c++ file file-handling


【解决方案1】:

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

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

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

对了,别忘了fclose

【讨论】:

  • 谢谢,帮了大忙
猜你喜欢
  • 2018-05-05
  • 2013-08-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-08
  • 1970-01-01
  • 2016-03-25
相关资源
最近更新 更多