【问题标题】:How can I seekg() files over 4GB on Windows?如何在 Windows 上 seekg() 超过 4GB 的文件?
【发布时间】:2012-03-13 10:12:19
【问题描述】:

我使用的是 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 进行检查。

【问题讨论】:

标签: c++ large-files unsigned-long-long-int


【解决方案1】:

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

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

【讨论】:

  • seek 操作实际上是从一个非常大的文件中检索非常小的信息,所以 seek 应该是有意义的。该文件确实以二进制文件的形式打开。
【解决方案2】:

您可能不得不使用多个相对搜索,即使用 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);

【讨论】:

    【解决方案3】:

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

    【讨论】:

    • 这是我的第一个想法,但我试图避免这种情况。我正在构建一个我希望是跨平台的库。最终我希望这个库可以在 Python 中使用,它本身就是跨平台的,并且支持 +4GB 文件访问。在文档中,他们建议使用 MSVC 构建 Windows 部署,这是我测试 MSVC 的第一个提示。
    猜你喜欢
    • 2010-10-16
    • 2013-02-18
    • 2021-09-09
    • 1970-01-01
    • 2015-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多