我以前的问题是关于原始数据的阅读和写作,但是出现了一个新问题,似乎没有结局....
问题是:lseek()
或fseek()
等函数的参数都是4个字节。如果我想跨越4G,那是不可能的。我知道在Win32中有一个函数SetPointer(...,Hign, Low,....)
,这个指针可以生成64个字节的指针,这就是我想要的。
但是,如果我想在Linux或Unix中创建一个应用程序(创建一个文件或直接写入 原始驱动器扇区),如何移动到4G上的指针?
Thanx,等待你的回复......
答案 0 :(得分:6)
lseek
的偏移参数属于off_t
类型。在32位编译环境中,此类型默认为32位有符号整数 - 但是,如果在所有系统包含之前使用此宏进行编译,则编译:
#define _FILE_OFFSET_BITS 64
...然后off_t
将是64位签名类型。
对于fseek
,fseeko
函数是相同的,只是它使用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
这就是你所需要的一切。