C++ 在C+中查找大于4GB的文件+;?
我正在使用MS Visual Studio 2012编译器,并且正在以x64发布模式构建 使用ifstream,我可以读取大于4GB的文件。问题是,我找不到一个10GB文件中间的位置。 当我像这样使用seekg时C++ 在C+中查找大于4GB的文件+;?,c++,visual-studio,stl,iostream,C++,Visual Studio,Stl,Iostream,我正在使用MS Visual Studio 2012编译器,并且正在以x64发布模式构建 使用ifstream,我可以读取大于4GB的文件。问题是,我找不到一个10GB文件中间的位置。 当我像这样使用seekg时is.seekg(5368709120,is.beg)thenis.tellg()返回-1,表示搜索失败。我确信文件存在,位置5368709120也存在。如果我使用:is.seekg(100,is.beg)例如 使用多个搜索不是一个选项,因为文件可以达到300GB(并且使用多个搜索会很慢
is.seekg(5368709120,is.beg)
thenis.tellg()代码>返回-1,表示搜索失败。我确信文件存在,位置5368709120也存在。如果我使用:is.seekg(100,is.beg)代码>例如
使用多个搜索不是一个选项,因为文件可以达到300GB(并且使用多个搜索会很慢)
我的问题是:如何让seek在不使用多个seek的情况下在10GB文件上正常工作?
如何让seek在不使用多个seek的情况下在10GB文件上正常工作
暂时忘记了文章的其余部分,这个问题的答案(在Windows中)非常简单:使用。我认为在处理大型文件时,降低到较低级别的API没有问题——您很可能正在执行大数据块读/写操作,对吗?您可以很容易地使用fread
和fwrite
来实现这一点
如果你坚持使用STL,微软的实现就行不通了。我听说STLPort处理大文件查找,所以您可以这样做。虽然这是一个相当严厉的方法,但我还是坚持基本的fseek
在这里查看答案,因为它可能与您试图做的相同。感谢各位的评论,但没有一个链接可以解决我的问题。我看到两个建议的备选问答;这两个问题的答案都不是很令人满意。关于这个问题的最后一条评论断言,微软的一些流函数的实现存在缺陷,在应该使用64位版本时使用32位版本。您是否尝试使用5368709120ULL
确保常量没有被截断?非常感谢您的回答!我将使用\u fseeki64
和\u ftelli64
查找文件并获取当前位置。有没有办法使用“fread”和“fwrite”一次读取或写入超过4GB的数据?老实说,UDMA不适合这种访问。即使您将整个Gig的数据存储在内存中(您不应该这样做),您也将使用小型缓冲区将数据传输到磁盘。现在32-64MB最适合使用。如果内存中有整个缓冲区,不要制作较小的缓冲区并将数据复制到fwrite
,从大缓冲区发送fwrite
调用,并带有偏移量和所需的操作长度。但是,如果您确实在处理大文件,那么无论如何都应该使用内存映射文件和普通内存块复制。那会给你最好的表现。