便携式支持大文件

时间:2015-06-16 12:38:51

标签: c++ c large-files

我看了

我仍然不知道如何以便携方式了解大于4 GB的文件大小。

值得注意的是,将一些答案纳入Cygwin的编译失败,而其他人则因Linux而失败。

1 个答案:

答案 0 :(得分:10)

事实证明,各种标准定义了很多功能:

  1. fseek / ftell

    它由ANSI标准库定义。几乎无处不在。它保证只能使用32位整数,但不需要(意味着您可以获得开箱即用的大文件支持)。

  2. fseeko / ftello

    这是由POSIX标准定义的。在许多平台上,根据_FILE_OFFSET_BITS的值,off_toff64_t定义为fseeko,将fseeko64定义为_FILE_OFFSET_BITS=64。{ / p>

  3. fseeko64 / ftello64

    这是fseekoftello的64位等价物。我无法在任何标准中找到相关信息。

    Cygwin不一致

    虽然它符合POSIX,但无论我在Cygwin下定义什么,我都无法编译fseeko,除非我使用--std=gnu++11这显然是无稽之谈,因为它是POSIX而不是GNU的一部分延期。什么给出了什么?根据{{​​3}}:

      

    64位文件访问是很自然的   Cygwin的文件访问类型。 off_t是8个字节。没有foo64   出于这个原因的功能。只需使用fopen和朋友就可以获得64分   位文件免费访问。

    对于POSIX平台上的cygwin,这意味着#ifdef

  4. _fseeki64 / _ftelli64

    这些是由Microsoft Visual C ++定义的,并且与其编译器一起使用。显然它不支持上面列表中的任何其他内容(fseek除外),因此您需要#ifdef s。

    编辑:我实际上建议不要使用它们和this discussion。我经历了以下经历:

    1. wfopen二进制模式的文件
    2. fwrite 10个字节值得它
    3. _ftelli64职位
    4. 它返回12而不是10个字节
    5. 看起来这是非常糟糕的。

    6. lseeklseek64

      由POSIX定义,这些将与从open()而不是unistd.h结构使用FILE*打开的整数文件描述符一起使用。这些与Windows不兼容。同样,他们使用off_t数据类型。

    7. _lseek_lseeki64

      这相当于Windows lseek / lseek64。奇怪的是,_lseeki64不使用off_t而是使用__int64,因此您知道它将适用于大文件。整齐。

    8. fsetpos / fgetpos

      虽然这些实际上非常便携,但它们几乎无法使用,因为它们在不透明结构而不是整数偏移上运行,这意味着您可以添加或减去它们,甚至导航到通过除以外的任何方式获得的文件中的某个位置fgetpos

    9. 结论

      因此,为了使您的程序可移植,取决于平台,您应该使用:

      • fseeko(POSIX)+在POSIX上定义_FILE_OFFSET_BITS=64
      • fseek用于Cygwin和默认实现
      • 适用于Windows的
      • _lseeki64 - 或者,如果您设法绕过它 - _fseeki64

      使用_ftelli64的示例:

      int64_t portable_ftell(FILE *a)
      {
      #ifdef __CYGWIN__
          return ftell(a);
      #elif defined (_WIN32)
          return _ftelli64(a);
      #else
          return ftello(a);
      #endif
      }
      

      实际上,不是检查对我来说总是看起来很脆弱的#ifdef,而是可以检查函数是否使用构建系统进行编译,并相应地定义自己的常量,例如HAVE_FTELLO64

      请注意,如果您确实决定使用lseek / _lseeki64系列和数字文件描述符而不是FILE*结构,那么您应该注意open之间的以下差异/ fopen

      • open不使用缓冲,fopen会使用缓冲。减少缓冲意味着性能更差。
      • open无法对文本文件执行换行转换,fopen可以。

        I'm not the only one who thinks that

      • 中的更多详情

      参考文献: