在 C++ 中查找超过 4GB 的文件?[复制]

Seeking in a file that is more than 4GB in C++? [duplicate]

提问人:zETO 提问时间:8/19/2015 最后编辑:zETO 更新时间:8/19/2015 访问量:1438

问:

我正在使用 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 文件?

C++ visual-Studio STL IOstream

评论

0赞 anurag-jain 8/19/2015
在这里看到答案 stackoverflow.com/questions/9405712/...因为它可能与你要做的事情相同。
0赞 zETO 8/19/2015
感谢您的评论,但是没有一个链接可以解决我的问题。
0赞 Jonathan Leffler 8/19/2015
我看到两个建议的替代问答;两者都不是很令人满意的答案。
0赞 Mark Ransom 8/19/2015
关于问题的最后一条评论 stackoverflow.com/questions/32057750/...断言,Microsoft在实现某些流函数时存在一个错误,使用32位版本,而它们应该使用64位版本。
0赞 Mark Ransom 8/19/2015
您是否尝试过确保常量不会被截断?5368709120ULL

答:

6赞 Blindy 8/19/2015 #1

如何在不使用多个搜索的情况下正确处理 10GB 文件?

暂时忘记您帖子的其余部分,这个问题的答案(在 Windows 中)非常简单:使用_fseeki64。我认为在处理大文件时下拉到较低级别的 API 没有问题——无论如何你很可能会进行大块读/写,对吧?您可以轻松使用并为此。freadfwrite

如果你坚持使用 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
如果内存中有整个缓冲区,请不要创建较小的缓冲区并将数据复制到其中,以便从具有偏移量和所需操作长度的大型缓冲区发送调用。但是,如果您确实在处理大文件,则无论如何都应该使用内存映射文件和普通内存块复制。这将为您提供最佳性能。fwritefwrite