我正在尝试访问程序的已编译二进制文件的长度,但它返回-1。有人可以指出我在正确的轨道上吗?我不确定为什么以下代码没有产生正确的结果。
std::fstream file(argv[0], std::ios::binary | std::ios::ate);
std::cout << file.tellg() << "\n";
我正在尝试访问程序的已编译二进制文件的长度,但它返回-1。有人可以指出我在正确的轨道上吗?我不确定为什么以下代码没有产生正确的结果。
std::fstream file(argv[0], std::ios::binary | std::ios::ate);
std::cout << file.tellg() << "\n";
只需添加std::ios::in
到打开模式标志就可以了。(构造函数未能打开文件。根据标准,您必须指定in
、out
或之一app
。)
将流类型更改为std::istream
也可以,但生成的二进制文件大 8 个字节。
结果 -1 表示打开失败。您应该始终对此进行测试:
if (std::fstream file(argv[0], std::ios::binary | std::ios::ate)) {
std::cout << file.tellg() << "\n";
} else {
// Report error.
}
第二个问题是,如果您只想获取它的长度,则应该以只读方式打开它(这可能是打开失败的原因):
std::ifstream file(argv[0], …);
第三个问题是argv[0]
不保证包含有效的可执行文件名称。这只是一个广泛持有的假设。你通常会逃脱它,但你应该记住它。