【Linux】利用文件标识符进行文件的读写

Linux的文件标识符,和Windows的就是文件名不同,它相当于文件的一个指针。在Linux的C语言中,除了用通用的《【C】文件读写问题》(点击打开链接)中介绍过的fopen等C语言通用操作文件以外,其Linux应用请参考《【Linux】利用C语言文件流复制单一文件》(点击打开链接),还能用文件标识符还来操作文件。这也是Linux中C语言,最底层,最原始控制文件的方式,其函数open,read,write,close已经完美地表明这一点。同时,在Linux无论是文件、设备和管道,甚至是个可操作对象对可以视作文件来对待,具体表现为都可以用这个文件标识符来操作他们。

文件标识符非常独特,并不是指针,其变量类型就是大家非常常用的int。

至于这个东西怎么用,具体请看如下文件读写程序:

#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>//文件控制
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#define MAXSIZE 512//缓冲区的大小
const char* FILEPATH="/tmp/file.txt";//文件目录
int main(void) {
    int fd;//文件标识符,
    char *s = "被折腾的文字";
    char buffer[MAXSIZE+1];//用来接字符的缓冲区
	int size;//读入的文件长度
    if((fd=open(FILEPATH,O_CREAT|O_TRUNC|O_RDWR,0777))<0){
		//O_CREAT如果指定文件不存在,则创建这个文件,O_EXCL如果要创建的文件已存在,则返回 -1,并且修改 errno 的值
		//O_APPEND每次写操作都写入文件的末尾,O_TRUNC如果文件存在,并且以只写/读写方式打开,则清空文件全部内容
		//O_RDONLY只读模式,O_WRONLY只写模式,O_RDWR读写模式
		//0777为最高权限
        perror("打开文件失败!");
        exit(1);
    }
    if((write(fd,s,strlen(s)))<0){
        perror("写入文件失败!");
        exit(1);
    }
    //lseek(fd,0,SEEK_SET);//即把文件指针移至buf文件的开始处
    lseek(fd,-strlen(s),SEEK_END);//即把文件指针往从结尾处向前移动strlen(s)个字符
    if((size=read(fd,buffer,MAXSIZE))<0){
        perror("读入文件失败!");
        exit(1);
    }else{
        buffer[size]='\0';//字符串数组封口
        printf("%s\n",buffer);		 
    }
    if(close(fd)<0) {
        perror("关键文件失败!");
        exit(1);
    }	
    unlink(FILEPATH);//删除文件	
    exit(0);
}
这个程序的一大堆头文件,是没办法的,因为所用到的函数需要的基本头文件就是这么多,但这些头文件都是Linux的基本头文件,能够拿来直接用。

程序首先打开并同时利用open的参数创建一个文件,之后向这个文件,通过read函数写入一个名为“缓冲区”buffer的字符数组,也就是字符串string的一些东西,然后,写入完毕,因为文件操作光标将会移到文件最后,所以我们要先将其移回文件头,再利用write函数读入这个文件的内容到buffer,并打印到屏幕,最后再用close关闭文件标识符与文件的连接,并利用unlink删除这个文件,如果没有close,unlink将不起作用,因为这个程序正在占用这个/tmp/file.txt,无法删除,如果要强制删除可以考虑remove函数。

所以,上述代码的运行结果如下图:


最后,这个文件自然是要被删除的了,肯定是没有的:


上述程序很简单,但我们更多应该关注这里文件标识符的作用。fd这个int就是文件标识符,相当于FILE *的作用,但他就是一个int。实质上,这个int非常独特,同open函数,int fd里面存着要被操作文件的地址,但它却又不是int *,之后的write和read函数都要根据这个fd所指明的方向来,你可以发现write,read参数都有一个地方,填入了fd,可要求填入的,却是一个int变量,这在windows里面是没有的,同时不了解文件标识符的人,看到write和read的使用可能是云里雾里的,之后的close就更不用说了,就是清楚这个fd与被操作文件的关联关系。

unlink函数则和文件标识符无关,需要一个文件路径的参数。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值