std :: ostream :: write有没有限制?

时间:2015-08-10 08:25:04

标签: c++ memory fstream binaryfiles large-files

当我们将大文件写入磁盘(超过4Gb)时,std::ostream::write是否有任何限制?

例如,当我写

ofs.write((char*)m.data, m.total()*sizeof(float));

表达式m.total()*sizeof(float)可以溢出吗?我需要以什么格式指定大小(int,long,int64)?

ofs.write的内存占用量是多少,是否需要一些额外的内存来完成操作,即。也许更高效的内存有效地逐行写入内存块?

更新

我在ubuntu x64上,但这段代码给了我sz< 0

std::streamsize sz= std::numeric_limits<int>::max()+10;
好吧,它的工作原理如下:

std::streamsize sz= std::streamsize(std::numeric_limits<int>::max())+10;

最后一个问题是m.total()返回size_t我该怎么办? 正确安全地将其转换为std::streamsize

1 个答案:

答案 0 :(得分:1)

没有这样的限制,因为大块文件可以通过块写入块。

std::ofstream::write的第二个参数属于std::streamsize类型,您可以在其中找到参考here

对于std::ofstream::write的内存占用,std::ofstream管理缓冲区本身,其大小是实现定义的,与传递给std::ofstream::write的第二个参数无关。因此,内存占用基本上是固定的。这也意味着对具有大尺寸(第二个参数)的高级std::ofstream::write的单次调用可能导致对一些底层写入函数的多次调用。因此,尝试将多个std::ofstream::write调用放入单个调用中并不会对您产生太大影响。您可以找到有关std::ofstream here管理的内部缓冲区的参考信息。

关于您的上一个问题,只有当std::size_t变量的值在std::streamsize的值范围内时,转换才是安全的。只要满足此条件,任何类型转换方法都可以正常工作。