2012-02-23 60 views
2

我在Windows 7,64位和NTFS上。 我正在构建一个必须是32位的DLL。我有一个非常简单的例程,我想用C++来实现。我正在阅读大文件使用:如何在Windows上查看超过4GB的kg()文件?

unsigned long p; 
ifstream source(file); 
streampos pp(p); 
source.seekg(pp); 

对于超过4GB的文件,我尝试使用无符号long long,但它不工作。 我在做什么错?我正在使用GNU GCC,它可以在尝试MSVC Express 2008/2010时使用吗?

更新:

似乎,什么是错我的GCC。现在,我正在使用MSVC测试您的提议,看起来可行。 MSVC使用_int64来表示streampos/streamoff对象,我将在稍后使用GCC进行检查。

+0

我遇到了这个:http://gcc.gnu.org/bugzilla/show_bug.cgi?id=8610 – 2012-02-23 14:39:54

回答

1

您可能不得不使用一些相对查找,即使用seekg的双参数超载。

// Start with seeking from the beginning 
source.seekg(some_pos, std::ios::beg); 

// Then seek some more from that position 
source.seekg(some_offset, std::ios::cur); 
1

我相信你将不得不使用本地的Win32调用来做到这一点像SetFilePointerExhttp://msdn.microsoft.com/en-us/library/aa365542(VS.85).aspx

+0

这是我的第一个想法,但我试图避免这一点。我正在建立一个我期望跨平台的图书馆。最终,我希望该库用于Python,它本身是跨平台的,并且支持+ 4GB文件访问。在文档中,他们建议使用MSVC进行Windows部署,这是我第一次测试MSVC。 – 2012-02-23 14:57:13

2

如果您是在32位系统上你很可能出于运气上运行做虽然简单的方法流库免费为其pos_type使用64位字。然而,它可能会使用相对的搜索。由于所有查找都返回pos_type,这表示当前位置,所以这仍然可能无法正常工作。

我想这只是我,但我从来没有发现寻求过于有用无论如何。当然,在实施这个混乱之后,我也意识到寻求必然会导致性能下降,并且只有在使用不使用代码转换的std::ios_base::binary模式下打开的文件时才会有效。

+0

查找操作实际上是从非常大的文件中检索非常小的信息,所以寻求应该是有道理的。该文件确实以二进制打开。 – 2012-02-23 15:00:46