Linux文件学习笔记

这篇博客详细介绍了Linux下的文件操作,包括使用open函数创建或打开文件、文件的读写、文件描述符的使用、文件复制函数的编写以及如何修改配置文件。还探讨了不同类型的数据显示,如整数和结构体的写入。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一:打开/创建文件

int open(const char *pathname,int flags);
int open(const char *pathname,int flags,mode_t mode);
//Pathname:要打开的文件名(含路径,缺省为当前路径)
//Flags: O_RDONLY 只读打开         O_WRONLY 只写打开         O_RDWR  可读可写打开
//Mode:一定是在flags中使用了O_CREAT标志,mode记录待创建的文件的访问权限

 使用open函数需添加头文件

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
fd  = open("./file1",O_RDWR);

若是打开的文件不存在,则需要加入O_CREAT 常数:

        O_CREAT:若文件不存在则创建它。使用此选项时,需要同时说明第三个参数mode,用其说明该新文件的存取许可权限。

fd = open("./file1",O_RDWR | O_CREAT,0600);

         1.可读 R 4          2.可写 W 2           3.可执行 X 1

fd为文件标识符,会返回一个整型数,若是文件打开或创建失败,返回-1

二:文件写入

需添加头文件

#include <unistd.h>
ssize_t write(int fd,const void *buf,size_t count);

   往fd里写入count大小的buf文件里的数据

n_write = write(fd,buf,strlen(buf));

        在此使用strlen:若是使用sizeof的话,该参数是指针类型,会返回的是指针的字节长度,而不是里面数据的长度,导致不能使数据完整的显示

使用close函数关闭文件,也需要包含头文件#include <unistd.h>

close(fd);

三:文件读取

使用同write

ssize_t read(int fd,const void *buf,size_t count);
n_read = read(fd,readBuf,n_write);

读取成功会返回整型长度,读取失败返回-1

会出现读取的长度为0的情况:在写操作的时候,光标会移到最后,这时候去读取,后面长度都为0,先使用重新打开文件的方式来读取

四:鼠标光标的移动

将文件读写指针相对whence移动offset个字节

off_t lseek(int fd,off_t offset,int whence);

offset:偏移值,负数往左偏移,正数往右偏移

whence:SEEK_SET :在开始位置

                SEEK_CUR:在当前位置

                SEEK_END:在结束位置

lseek(fd,0,SEEK_SET);
lseek(fd,-5,SEEK_CUR);
lseek(fd,-5,SEEK_END);

该函数的返回值为offset的大小,可以通过此方式得出文件大小

int filesize = lseek(fd,0,SEEK_END);

五:写入及创建的补充

1.O_EXCL:可验证文件是否存在

fd = open("./file1",O_RDWR | O_CREAT | O_EXCL,0600);

如果同时指定了OCREAT,而文件已经存在,则出错。      

2.O_APPEND

fd = open("./file1",O_RDWR | O_APPEND);

每次写时都加到文件的尾端。 

否则会覆盖原来的文件

3.O_TRUNC

fd = open("./file1",O_RDWR | O_TRUNC);

属性去打开文件时,如果这个文件中本来是有内容的,而且为只读或只写成功打开,则将其长度截短为0。

直接全部覆盖原先的内容

4.创建文件

int creat(const char *filename,mode_t mode)

filename:当前要创建的文件夹,包含路径

mode:创建模式

                S_IRUSR  4  可读

                S_IWUSR  2  可写

                S_IXUSR  1  可执行

                S_IRWXU  7  可读可写可执行

六: 文件描述符

  • 所有文件都由文件描述符引用,是一个非负整数,用文件描述符来标识这个文件。
  • 0--标准输入,1--标准输出,2--错误返回
  • 文件使用文件描述符区分
  • 文件描述符在退出当前进程后就没有意义了

文件在打开之后进行操作后需要进行关闭文件

文件平时存放在文件系统文件中时称为静态文件,而当文件的内容从块设备被读取到内核申请的内存特定地址后为动态文件

 

七:编写cp函数

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>

int main(int argc,char **argv)
{
	int fdSrc;
	int fdDes;
	char *readBuf = NULL;
	int n_write;
	


	if(argc != 3){
		printf("pattern error\n");
		exit(-1);
	}

	fdSrc = open(argv[1],O_RDWR);

	int size = lseek(fdSrc,0,SEEK_END);
	lseek(fdSrc,0,SEEK_SET);
	readBuf = (char *)malloc(sizeof(char)*size+8);

	int n_read = read(fdSrc,readBuf,size);

	fdDes = open(argv[2],O_RDWR | O_CREAT,0600);

	n_write = write(fdDes,readBuf,strlen(readBuf));
	
	close(fdSrc);
	close(fdDes);

	return 0;
}

思路:

1.打开src

2.读src

3.打开/创建des

4.写des

5.关闭两个文件

八:修改配置文件

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>

int main(int argc,char **argv)
{
	int fdSrc;
	char *readBuf = NULL;
	int n_write;
	

	if(argc != 2){
		printf("pattern error\n");
		exit(-1);
	}

	fdSrc = open(argv[1],O_RDWR);
		
	int size = lseek(fdSrc,0,SEEK_END);
	lseek(fdSrc,0,SEEK_SET);
	readBuf = (char *)malloc(sizeof(char)*size+8);

	int n_read = read(fdSrc,readBuf,size);

	char *p = strstr(readBuf,"LENG=");
	if(p == NULL){
		printf("not found!\n");
		exit(-1);
	}
	p = p + strlen("LENG=");
	*p = '5';

	lseek(fdSrc,0,SEEK_SET);
	n_write = write(fdSrc,readBuf,strlen(readBuf));
	
	close(fdSrc);

	return 0;
}

思路:

1.找出字符串

2.找出要修改的位置

3.修改

九:写入不同类型数据

1.整数

int main()
{
	int fd;
	int  data = 100;

	fd = open("./file1",O_RDWR);
	
	int n_write = write(fd,&data,sizeof(int));
	
	lseek(fd,0,SEEK_SET);

	int n_read = read(fd,&data,sizeof(int));

	printf("read:%d\n",data);
	
	close(fd);

	return 0;
}

2.写入结构体


struct Test
{
	int a;
	char c;
};

int main()
{
	int fd;
	struct Test data = {100,'a'};
	struct Test data1;

	fd = open("./file1",O_RDWR);
	
	int n_write = write(fd,&data,sizeof(struct Test));
	
	lseek(fd,0,SEEK_SET);

	int n_read = read(fd,&data1,sizeof(struct Test));

	printf("read:%d,%c\n",data1.a,data1.c);
	
	close(fd);

	return 0;
}

3.结构体数组

struct Test
{
	int a;
	char c;
};

int main()
{
	int fd;
	struct Test data[2] = {{100,'a'},{101,'b'}};
	struct Test data1[2];

	fd = open("./file1",O_RDWR);
	
	int n_write = write(fd,&data,sizeof(struct Test)*2);
	
	lseek(fd,0,SEEK_SET);

	int n_read = read(fd,&data1,sizeof(struct Test)*2);

	printf("read:%d,%c\n",data1[0].a,data1[0].c);
	printf("read:%d,%c\n",data1[1].a,data1[1].c);
	
	close(fd);

	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值