【问题标题】:Read large file in C++用 C++ 读取大文件
【发布时间】:2016-06-02 09:50:14
【问题描述】:

我管理一个大小为 2.15GB 的 PDF 文件,我用 fopen 打开文件,我使用_fseeki64_ftelli64 来获取或更新文件中的指针位置,它可以正常工作。

我使用fread 来读取pdf 文件。通常它可以正常工作,但是当读取指针位于文件末尾附近时,fread 会得到错误的 EOF 字符。

那么,我怎样才能正确读取这个大 PDF 文件。

注意:我对小于 2GB 的文件使用相同的源代码,它可以正常工作。

【问题讨论】:

  • 您能否将代码简化为能够可靠地演示问题的简短程序?除非您这样做,否则没有人可以提供帮助,因为不知道您做错了什么。
  • "当读取指针位于文件末尾附近时,fread 得到错误的 EOF 字符" - 你能详细说明一下吗?
  • 你能保证在读入文件时进程没有耗尽可用内存吗?
  • @DavidSchwartz _fseeki64 似乎仅限 Windows
  • @LưuVĩnhPhúc:在 32 位系统上处理大小为 2.15GB 的文件时,size_t 不会成为问题。

标签: c++ fread


【解决方案1】:

在我看来,您正在看到有符号 32 位整数的 2G 限制。此类变量的最大值为 2,147,483,647。

编辑

使用调试器并检查发送到_fseeki64_ftelli64实际值和类型

【讨论】:

    【解决方案2】:

    借助现代编译器(Windows 上的 VS2012+),您可以使用fstream,这是访问大文件的标准方式。

    详情请见this answer

    【讨论】:

      【解决方案3】:

      既然你提到了EOF之类的东西,所以请检查你是否正确使用了fread。最重要的是,如果您尝试在其中读取数据块的循环。

      请检查您是否不是Wrongly using loop while using fread的受害者

      【讨论】:

        【解决方案4】:

        fread函数没有问题,但是文件的读指针已经位于文件末尾。这就是它返回 EOF 的原因。 当我更改读取指针位置时, fread 工作正常。

        【讨论】:

        • 此信息应通过编辑添加到您的问题中,而不是作为答案发布 - 所以不是论坛。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-12-23
        • 1970-01-01
        • 1970-01-01
        • 2021-12-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多