我在Windows 7,64位和NTFS上。 我正在构建一个必须是32位的DLL。我有一个非常简单的例程,我想在C ++中实现。我正在使用以下方式阅读大文件:
unsigned long p;
ifstream source(file);
streampos pp(p);
source.seekg(pp);
对于超过4GB的文件,我尝试使用unsigned long long,但它不起作用。 我究竟做错了什么?我正在使用GNU GCC,试用MSVC Express 2008/2010会有什么用处吗?
更新
我的海湾合作委员会似乎有问题。现在我正在使用MSVC测试您的提案,它似乎正在运行。 MSVC使用_int64来表示streampos / streamoff对象,稍后我将与GCC一起检查。
答案 0 :(得分:2)
如果你在32位系统上运行,你可能会以简单的方式做到这一点,尽管流库可以为其pos_type
免费使用64位字。但是,它可能有助于使用相对寻求。由于所有的搜索都会返回pos_type
,这可能表示当前的位置,但这仍然可能效果不佳。
我想这只是我,但我从来没有找到寻求过于有用的东西。当然,实现了这个混乱之后,我也意识到搜索必然会破坏性能,而且只有在使用std::ios_base::binary
模式下打开且不使用代码转换的文件时才能正常工作。
答案 1 :(得分: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);
答案 2 :(得分:1)
我相信您必须使用原生Win32调用来执行此操作,例如SetFilePointerEx
http://msdn.microsoft.com/en-us/library/aa365542(VS.85).aspx