本文目录
- 如何通过使用lseek获取文件的长度
- lseek函数出现空洞的返回值是什么啊
- 问一个关于lseek函数的效率问题
- 为什么C语言中read函数和write函数间要用lseek来调整读取顺序
- linux系统中用lseek()生成的空洞文件有什么用
如何通过使用lseek获取文件的长度
获取文件长度先把文件指针移动到文件结尾,然后得出文件指针相对于文件头的偏移量,这个偏移量就是以字节计算的文件长度:unsigned long int len; //用len存储文件长度fseek(pf,0,SEEK_END); //移动到文件尾 ,假设文件指针变量为pflen=ftell(pf); //ftell函数返回当前文件指针相对于文件头的偏移量,文件指针位于文件尾的话,那返回值就相当于文件长度了
lseek函数出现空洞的返回值是什么啊
函数名: lseek 功 能: 移动文件读/写指针 用 法: long lseek(int handle, long offset, int fromwhere); 所有打开的文件都有一个当前文件偏移量(current file offset),以下简称为 cfo。cfo 通常是一个非负整数,用于表明文件开始处到文件当前位置的字节数。读写操作通常开始于 cfo,并且使 cfo 增大,增量为读写的字节数。文件被打开时,cfo 会被初始化为 0,除非使用了 O_APPEND 。 使用 lseek 函数可以改变文件的 cfo 。 lseek 的以下用法返回当前的偏移量: off_t currpos; currpos = lseek(fd, 0, SEEK_CUR); 这个技巧也可用于判断我们是否可以改变某个文件的偏移量。如果参数 fd(文件描述符)指定的是 pipe(管道)、FIFO 或者 socket,lseek 返回 -1 并且置 errno 为 ESPIPE。 对于普通文件(regular file),cfo 是一个非负整数。但对于特殊设备,cfo 有可能是负数。因此,我们不能简单地测试 lseek 的返回值是否小于 0 来判断 lseek 成功与否,而应该测试 lseek 的返回值是否等于 -1 来判断 lseek 成功与否。 lseek 仅将 cfo 保存于内核中,不会导致任何 I/O 操作。这个 cfo 将被用于之后的读写操作。 如果 offset 比文件的当前长度更大,下一个写操作就会把文件“撑大(extend)”。这就是所谓的在文件里创造“空洞(hole)”。没有被实际写入文件的所有字节由重复的 0 表示。空洞是否占用硬盘空间是由文件系统(file system)决定的。本段程序例 #include 《stdio.h》 #include 《stdlib.h》 #include 《string.h》 #include 《unistd.h》 #include 《sys/types.h》 #include 《fcntl.h》 int main(void) { int handle; char msg = "This is a test"; char ch; /* create a file */ handle = open("TEST.$$$", O_CREAT | O_RDWR, S_IREAD | S_IWRITE); /* write some data to the file */ write(handle, msg, strlen(msg)); /* seek to the begining of the file */ lseek(handle, 0L, SEEK_SET); /* reads chars from the file until we hit EOF */ do { read(handle, &ch, 1); printf("%c", ch); } while (!eof(handle)); close(handle); return 0; }
问一个关于lseek函数的效率问题
lseek是库函数。库函数就是C++最基本的函数,也就是说没有这些东西无法定义C++。C++的制定标准,并不决定库函数的底层是如何实现的,主要决定实现结果和大致逻辑。所以,对于不同系统不同型号机器的lseek,它的实现是不一样的。在大多数系统中,lssek的执行只是改变一个内存中的值。计算机读取磁盘很慢,而内存很快,于是操作系统在内存中会事先保存好多值,当下一个读盘周期开始的时候,计算机会以最优化的读取顺序读取内存中设置的磁盘位置,lssek改变的就是那个位置。所以耗时依赖你的系统和硬件,10000 比100未必慢
为什么C语言中read函数和write函数间要用lseek来调整读取顺序
-由于程序在打开文件时文件操作指针位于文件起始位置,即偏移量0-读取了1个字符的内容给变量c,文件指针偏移量为1-这时如果想将c值写到文件开始位置,则需要移动文件指针到文件开始-于是lseek就是移动文件当前指针的语句,它通知系统将文件指针移动到从文件开始位置(SEEK_SER)起的第0字节-这个程序比较奇怪,明明打开文件时选用了0_WRONLY参数,表明这个打开是只写的,但上来就读
linux系统中用lseek()生成的空洞文件有什么用
空洞文件很有用的,看看迅雷下载的文件,在未下载完成时就已经占据了全部文件大小的空间,这时候就是空洞文件。下载时如果没有空洞文件,多线程下载时文件就都只能从一个地方写入,这就不是多线程了。如果有了空洞文件,可以从不同的地址写入,就完成了多线程的优势任务。在开发过程中有时候需要为某个文件快速地分配固定大小的磁盘空间(1)可以让文件尽可能的占用连续的磁盘扇区,减少后续写入和读取文件时的磁盘寻道开销;(2)迅速占用磁盘空间,防止使用过程中所需空间不足。(3)后面再追加数据的话,不会需要改变文件大小,所以后面将不涉及metadata的修改。lseek()系统调用功能说明:通过指定相对于开始位置、当前位置或末尾位置的字节数来重定位 curp,这取决于 lseek() 函数中指定的位置函数原型:#include 《sys/types.h》 #include 《unistd.h》off_t lseek(int fd, off_t offset, int whence);参数说明:fd:文件描述符offset:偏移量,该值可正可负,负值为向前移whence:搜索的起始位置,有三个选项:(1).SEEK_SET: 当前位置为文件的开头,新位置为偏移量大小 (2).SEEK_CUR: 当前位置为文件指针位置,新位置为当前位置加上偏移量大小 (3).SEEK_END: 当前位置为文件结尾,新位置为偏移量大小返回值:文件新的偏移值