关于文件寻找位置的问题

时间:2009-11-06 09:24:30

标签: linux winapi seek fseek

我以前的问题是关于原始数据的阅读和写作,但是出现了一个新问题,似乎没有结局....

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

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

Thanx,等待你的回复......

3 个答案:

答案 0 :(得分:6)

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

#define _FILE_OFFSET_BITS 64

...然后off_t将是64位签名类型。

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

答案 1 :(得分:5)

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

答案 2 :(得分:2)

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

我建议通过这样的方式在两个系统上使用lseek64()

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

这就是你所需要的一切。