最简单的解决方案是:
std::vector<char> data( (std::istreambuf_iterator<char>( file )),
(std::istreambuf_iterator<char>()) );
这将创建一个与您读取的字节数完全相同的向量。从性能的角度来看,这并不是最优的:会有重新分配和复制,因为向量无法提前知道要分配多少。但这对于大多数用途来说已经足够了。(重新分配和复制通常比实际读取花费的时间更少。)
如果你真的想预先分配,没有真正可移植的解决方案。事实上,在包括 Windows 在内的许多系统上,
无法预先知道char
您可以从以文本模式打开的文件中读取多少内容。然而,在实践中,寻求结束,然后将结果转换为
istream::tellg()
足够大的整数类型将在 Windows 和 Unix 系统下工作,在 Unix 下给出精确的结果,并且值通常有点太大(但可能高达实际大小的两倍)在 Windows 下。这几乎是你能做到的。(请注意,从技术上讲,您甚至可以保证istream::tellg
甚至可以转换为整数类型,或者如果是,结果不是一些神奇的 cookie。然而,在实践中,它可以在 Windows 和 Unix 下工作,尽管可能不在大型机上。)
否则,您可以使用系统特定的功能
GetFileSize
(或stat
在 Unix 下),但有相同的限制:Unix 的结果将是准确的,如果您以文本模式打开文件,则 Windows 下的结果会比所需的稍大。