【问题标题】:Calling stat from <sys/stat.h> faills with "Value too large for defined data type" error从 <sys/stat.h> 调用 stat 失败并出现“值对于定义的数据类型而言太大”错误
【发布时间】:2012-12-03 08:01:06
【问题描述】:

给定 tmp.c:

#include <sys/stat.h>
#include <errno.h>
#include <stdio.h>

int main(int argc, const char *argv[])
{
    struct stat st;
    if (stat(argv[1], &st) != 0)
    {
        perror("Error calling stat");
    }

    return 0;
}

当我在一个大文件(~2.5 Gb)上运行程序时,我得到了Error calling stat: Value too large for defined data type

【问题讨论】:

  • 只有在文件大小超过(2&lt;&lt;31)-1 位时,才会在 32 位系统上发生此 (EOVERFLOW)。

标签: c posix runtime-error system-calls


【解决方案1】:

需要#define _FILE_OFFSET_BITS 64:要么在你之前添加 #include &lt;sys/stat.h&gt; 或以特定于平台的方式定义它,例如,对于 gcc,请参见 -D 选项;对于 Visual Studio,请转到项目属性 -> 配置属性 -> C/C++ -> 预处理器 -> 预处理器定义

【讨论】:

  • 这真的很有帮助!当我统计 SD 上超过 2GB 的文件时,我遇到了这个问题。它给了我“值太大...”错误消息。现在我可以在我的 Android 设备上统计它们了。
【解决方案2】:

如果其他人有这个问题,并且#include "sys/stat.h" 之前的_FILE_OFFSET_BITS 64 还没有解决它,那么也将它移到所有其他包含的前面。我没有发现哪些标题也依赖于此,但它解决了问题。

【讨论】:

  • 谢谢,你刚刚帮我修复了一个错误!
  • 所选答案对我不起作用。但是这个做到了,ty!
【解决方案3】:

看看这个link。它为您提供了处理此类问题的方法。

这通常通过定义 -D_FILE_OFFSET_BITS=64 或类似的来完成。它取决于系统。一旦完成并切换到这种新模式,大多数程序都会很好地支持大文件。

【讨论】:

    【解决方案4】:

    您可以通过在程序中包含头文件 config.h 来消除此限制。 这不是必须包含整个文件,但您也可以放置一个宏#define _FILE_OFFSET_BITS 64 来消除限制。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多