Linux C编程之常用文件I/O操作(4)

每个打开文件都有一个与其相关联的“当前文件位移量”。它是一个非负整数,用以度量从文件开始处计算的字节数。

需要用到的头文件 #include<sys/types.h> #include<unistd.h> 函数原型: off_t lseek(int filedes,off_t offset,int whence);                                             返回值:若成功为新的文件的位移,若出错位-1

    对参数offset 的解释与参数whence的值有关。

    若whence是SEEK_SET,则将该文件的位移量设置为距文件开始处offset 个字节。

    若whence是SEEK_CUR,则将该文件的位移量设置为其当前值加offset, offset可为正或负。

    若whence是SEEK_END,则将该文件的位移量设置为文件长度加offset, offset可为正或负。*******************************************************************************************

重要概念:

    (1)文件指针:当我们要对一个文件进行读写时,一定需要先打开这个文件,所以我们读写的所有文件都是动态文件。动态��件在内存中的形态就是文件流的形式。

    (2)文件流很长,里面有很多个字节。那我们当前正在操作的是哪个位置?GUI模式下的软件用光标来标识这个当前正在操作的位置,这是给人看的。

    (3)在动态文件中,我们会通过文件指针来表征这个正在操作的位置。所谓文件指针,就是我们文件管理表这个结构体里面的一个指针。所以文件指针其实是vnode中的一个元素。这个指针表示当前我们正在操作文件流的哪个位置。这个指针不能被直接访问,linux系统用lseek函数来访问这个文件指针。

    (4)当我们打开一个空文件时,默认情况下文件指针指向文件流的开始。所以这时候去write时写入就是从文件开头开始的。write和read函数本身自带移动文件指针的功能,所以当我write了n个字节后,文件指针会自动向后移动n位。如果需要人为的随意更改文件指针,那就只能通过lseek函数了

    (5)read和write函数都是从当前文件指针处开始操作的,所以当我们用lseek显式的将文件指针移动后,那么再去read/write时就是从移动过后的位置开始的。

    (6)回顾前面一节中我们从空文件,先write写了12字节,然后read时是空的(但是此时我们打开文件后发现12字节确实写进来了)。

lseek函数几个用途:

    1、用lseek计算文件长度

(1)linux中并没有一个函数可以直接返回一个文件的长度。但是我们做项目时经常会需要知道一个文件的长度,怎么办?自己利用lseek来写一个函数得到文件长度即可。

 

#include<stdio.h> #include<unistd.h> #include<sys/types.h> #include<sys/stat.h> #include<fcntl.h> #include<stdlib.h> #include<string.h> #include<errno.h> typedef int file_t; #define MAXLENG 1024 int main(int argc,char *argv[]) { file_t fd = -1; ssize_t ret = -1; if(2 != argc) { fprintf(stdout,"usage: %s filename \n",argv[0]); _exit(-1); } char buffer[MAXLENG] = {0}; fd = open(argv[1],O_RDONLY); //文件打开成功,文件指针指向文件开头 if(-1 == fd)   { perror("open file error:"); _exit(-1); } else { fprintf(stdout,"文件打开成功\n"); ret = lseek(fd,0,SEEK_END); } fprintf(stdout,"文件长度是: %d\n",ret); return 0; }

     2、用lseek构建空洞文件

(1)空洞文件就是这个文件中有一段是空的。

(2)普通文件中间是不能有空的,因为我们write时文件指针是依次从前到后去移动的,不可能绕过前面直接到后面。

(3)我们打开一个文件后,用lseek往后跳过一段,再write写入一段,就会构成一个空洞文件。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/dc638955cda3552e27901b973743936a.html