分类: C/C++
2010-10-09 14:07:23
lseek和空洞文件
函数原型
#include
#include
off_t lseek (int fd, off_t offset, int whence);
函数说明
lseek显式为一个打开的文件设置其偏移量.
参数offset
^ 若whence是SEEK_SET,则将该文件的偏移量设置位开始处offset个字节;
^ 若whence是SEEK_CUR,则将该文件的偏移量设置为其当前值加offset,offset可为正或负;
^ 若whence是SEEK_END,则将该文件的偏移量设置为文件长度加offset,offset可为正或负;
函数执行
若lseek执行成功,则返回新文件的偏移量,为此可以用下列方式打开文件当前的偏移量.
off_t currpos;
currpos = lseek (fd, 0, SEEK_CUR);
该方法也可用于确定所涉及的文件是否可以设置偏移量.如果文件描述符引用的是一个管道,FIFO或者Socket,则lseek返回-1.并将errno设置为ESPIPE.
通常文件的偏移量是一个非负数,但某些设备允许负的偏移量.但对于普通文件,其偏移量必须是非负的.因为偏移量可能是负值,所以在比较lseek的返回值时应当谨慎,不能测试返回值是否小于0,而要测试它是否等于-1.
文件空洞
文件偏移量可能大于文件的当前长度.在这种情况下,对该文件的下一次写将加长该文件.并在文件中构成一个空洞,这一点是允许的.位于文件中但是没有写过的字节都被读为0.
文件中的空洞并不要求在磁盘上占用存储区,具体处理方式与文件系统的实现相关.当定位到超出问及爱你尾端以后写时,对于新写的数据需要分配磁盘块,但是对于原文件尾端和新开始写位置之间的部分则不需要分配磁盘块.
创建空洞文件实例
#include
#define FILESIZE (2*1024*1024)
int createNullFile (const char *filePath, unsigned long size)
// 'size' is file size use BYTE,
{
FILE* stream;
if ((stream = fopen (filePath, "wb")) == NULL)
{
return -1;// FAIL
}
fseek (stream, size-1, SEEK_SET);
fputc (0, stream);
fclose (stream);
return 0; // SUCCESS
}
int main (void)
{
return createNullFile ("./temp", FILESIZE);
}