2012-02-23 31 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