C++ 确定已编译二进制文件的长度

C++ 确定已编译二进制文件的长度,c++,C++,我试图访问程序已编译二进制文件的长度,但它返回-1。有人能给我指出正确的方向吗?我不确定为什么下面的代码不能产生正确的结果 std::fstream file(argv[0], std::ios::binary | std::ios::ate); std::cout << file.tellg() << "\n"; std::fstream文件(argv[0],std::ios::binary | std::ios::ate); std::cout结果-1表示打开失败。

我试图访问程序已编译二进制文件的长度,但它返回-1。有人能给我指出正确的方向吗?我不确定为什么下面的代码不能产生正确的结果

std::fstream file(argv[0], std::ios::binary | std::ios::ate);
std::cout << file.tellg() << "\n";
std::fstream文件(argv[0],std::ios::binary | std::ios::ate);

std::cout结果-1表示打开失败。您应该始终为此进行测试:

if (std::fstream file(argv[0], std::ios::binary | std::ios::ate)) {
    std::cout << file.tellg() << "\n";
} else {
    // Report error.
}

第三个问题是,
argv[0]
不能保证包含有效的可执行文件名。这只是一个被广泛接受的假设。通常情况下,您可以不受影响,但您应该记住这一点。

只需将
std::ios::in
添加到开放模式标志中,就可以让它对我起作用。(构造函数未能打开该文件。根据标准,您必须在
中指定
中指定一个
应用程序


将流类型更改为
std::istream
也可以,但生成的二进制文件要大8个字节。

可能是重复的,请尝试其中一个答案,然后查找文件的结尾,然后就可以了。啊,非常感谢。对我来说,更改流类型实际上破坏了它,但是使用ios::in规范,它工作得很好。奇怪的是,istream会将文件大小增加这么多。啊,谢谢。我将添加一个检查,以确保它读取可执行文件,但没有意识到这不是一个保证。与此问题相关的是,即使
argv[0]
包含有意义的文件名,它在传递到
ifstream
时仍可能无法正确解析。例如,如果您的程序foobar位于路径上,但不在当前目录中,
argv[0]
将包含
foobar
,该文件将无法打开,因为当前目录中没有名为foobar的文件……或者如果用户以与shell用于查找该文件的权限不同的权限执行该程序,例如使用
sudosomeuser
。有无数的事情会出错。C++甚至不保证机器上有文件系统。当然,即使存在文件系统,程序也可能不会存储在文件中。@user2142343:是的,但是如果您接受我的建议使用
std::ifstream
,那么您基本上已经规定您只想读取。即使修复了此问题,也可能不允许写入正在运行的程序的二进制文件。你当然不能在Windows中;Linux限制较少,但您可能仍然会遇到问题。@user2142343:如果您提供一些背景信息,您可能会从SO得到更有用的响应。你为什么要这样做?你想达到什么目标?这将减少绊倒的风险。
std::ifstream file(argv[0], …);