2

我在 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 会有用吗?

更新:

我的 GCC 似乎有问题。现在,我正在使用 MSVC 测试您的提案,并且似乎可以正常工作。MSVC 使用 _int64 来表示 streampos/streamoff 对象,稍后我将使用 GCC 进行检查。

4

3 回答 3

2

如果您在 32 位系统上运行,那么您可能不太走运,尽管流库可以免费使用 64 位字作为pos_type. 但是,使用相对搜索可能会起作用。由于所有搜索都返回 a pos_type,它应该表示当前位置,这可能仍然不能很好地工作。

我想这只是我,但无论如何我从来没有发现寻求太有用。当然,在实现了这种混乱之后,我也意识到搜索势必会降低性能,并且它仅在使用以std::ios_base::binary不使用代码转换的模式打开的文件时才真正起作用。

于 2012-02-23T01:21:52.337 回答
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);
于 2012-02-23T01:17:37.350 回答
1

我相信您必须使用本机 Win32 调用来执行此操作,例如SetFilePointerEx http://msdn.microsoft.com/en-us/library/aa365542(VS.85).aspx

于 2012-02-23T01:20:15.223 回答