提问人:zETO 提问时间:8/19/2015 最后编辑:zETO 更新时间:8/19/2015 访问量:1438
在 C++ 中查找超过 4GB 的文件?[复制]
Seeking in a file that is more than 4GB in C++? [duplicate]
问:
我正在使用 MS Visual Studio 2012 编译器,并且正在 x64 发布模式下构建。
使用 ifstream,我可以读取大于 4GB 的文件。问题是,我无法在 10GB 文件的中间寻找位置。
当我像这样使用 seekg 时,返回 -1,这意味着搜索失败。我确信该文件存在,位置5368709120也存在。如果我使用:例如,它工作得很好。is.seekg (5368709120, is.beg);
is.tellg();
is.seekg (100, is.beg);
使用多个搜索不是一种选择,因为文件可以达到 300GB(并且使用多个搜索会很慢)。
我的问题是:如何在不使用多个搜索的情况下正确处理 10GB 文件?
答:
6赞
Blindy
8/19/2015
#1
如何在不使用多个搜索的情况下正确处理 10GB 文件?
暂时忘记您帖子的其余部分,这个问题的答案(在 Windows 中)非常简单:使用_fseeki64
。我认为在处理大文件时下拉到较低级别的 API 没有问题——无论如何你很可能会进行大块读/写,对吧?您可以轻松使用并为此。fread
fwrite
如果你坚持使用 STL,Microsoft 的实现将不起作用。我听说 STLPort 可以处理大文件搜索,所以你可以这样做。不过,这是一种相当沉重的方法,我会坚持使用基本的方法。fseek
评论
0赞
zETO
8/19/2015
非常感谢您的回答!我将使用并寻找文件并在那里获得当前位置。有没有办法使用“fread”和“fwrite”一次读取或写入超过 4GB?_fseeki64
_ftelli64
0赞
Blindy
8/19/2015
老实说,没关系,UDMA 不是为这种访问而设计的。即使您将整个千兆数据存储在内存中(您不应该这样做),您也会使用小型缓冲区将数据通过管道传输到磁盘。如今,32-64MB 效果最好。
0赞
Blindy
8/19/2015
如果内存中有整个缓冲区,请不要创建较小的缓冲区并将数据复制到其中,以便从具有偏移量和所需操作长度的大型缓冲区发送调用。但是,如果您确实在处理大文件,则无论如何都应该使用内存映射文件和普通内存块复制。这将为您提供最佳性能。fwrite
fwrite
评论
5368709120ULL