【问题标题】:Question about file seeking position关于找文件位置的问题
【发布时间】:2009-11-06 09:24:29
【问题描述】:

我之前的问题是关于原始数据的读写,但是又出现了一个新的问题,好像没有结局....

问题是:lseek()fseek()等函数的参数都是4个字节。如果我想将跨度移动到 4G 之上,那是不可能的。我知道在Win32中,有一个函数SetPointer(...,Hign, Low,....),这个指针可以生成64字节的指针,这正是我想要的。

但是如果我想在 Linux 或 Unix 中创建一个应用程序(创建一个文件或直接写 原始驱动器扇区),如何移动到超过 4G 的指针?

谢谢,等待您的回复...

【问题讨论】:

    标签: linux winapi seek fseek


    【解决方案1】:

    lseek 的偏移量参数是off_t 类型。在 32 位编译环境中,此类型默认为 32 位有符号整数 - 但是,如果您使用在所有系统包含之前定义的此宏进行编译:

    #define _FILE_OFFSET_BITS 64
    

    ...那么off_t 将是 64 位有符号类型。

    对于fseekfseeko 函数是相同的,只是它使用off_t 类型作为偏移量,这使得上述解决方案也可以使用它。

    【讨论】:

    • windows中_FILE_OFFSET_BITS的原始定义在哪里
    • @Macroideal:你自己应该在你的 .c 文件中 #define _FILE_OFFSET_BITS,在任何 #includes 之前。
    • 好吧,@caf 给出了确切的答案。为了实现它,您可以默认添加 -D_LARGEFILE_SOURCE、-D_LARGEFILE64_SOURCE 或 -D_FILE_OFFSET_BITS=64 到任何 Makefile 或编译器参数的 CFLAGS/XXFLAGS。
    【解决方案2】:

    一个4字节的无符号整数可以表示最大为4294967295的值,这意味着如果要移动超过4G,则需要使用lseek64()。另外,您可以使用 fgetpos() 和 fsetpos() 来改变文件中的位置。

    【讨论】:

    • 如何在linux和windows中使用lseek64()函数,在linux中编译时是否需要包含一些库
    • lseek64() 是 POSIX 定义的函数,因此它仅在具有 POSIX API 的系统上可用。它在 glibc 中可用(自 2.1 起),但是,对于 glibc,您需要包含 define #define _LARGEFILE64_SOURCE 才能使其可用。
    • 只是通过在源代码中设置一些宏和#if 并制作配置头来解决差异。
    【解决方案3】:

    在 Windows 上,使用 _lseeki64(),在 Linux 上,lseek64()

    我建议通过以下方式在两个系统上使用lseek64()

    #ifdef _WIN32
    #include <io.h>
    #define lseek64 _lseeki64
    #else
    #include <unistd.h>
    #endif
    

    这就是你所需要的。

    【讨论】:

      猜你喜欢
      • 2021-11-30
      • 1970-01-01
      • 2023-04-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-08
      相关资源
      最近更新 更多