努力学习Day16【Linux】

文章通过一个C语言程序示例,展示了如何在Linux环境下读取和修改文件内容,特别是针对配置文件中的特定值进行更新,同时讨论了光标移动在文件操作中的重要性,以及如何避免写入时产生额外的新行。

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

距离过年还有17天,到年的时候再好好放松,其他时候还是好好学习为主

================================================================

今天学习的是

文件的操作原理:

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h> 
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
int main()
{
	int fd;
	char readBuf[128];   //从键盘1288节输入readBuf
	
	int *buf;

	int n_read=read(0,readBuf,5);  //读取从位置0开始。读取的内容为readBuf,读取5个字节,标准输入

	int n_write=write(1,buf,strlen(readBuf)); //标准输出,输出的内容为readBuf

	return 0;
}

我们来编译看看:

 输入五个字符hello,输出也是hello!

cp指令用法:

使用格式为: cp 文件名 文件名

这样的话我们就能创建一个与demo1.c内容一样但是文件名不一样的demo2.c文件

文件内容的配置:

我们的软件或者游戏在运行的过程中,数据都在不断的变化更替写入编辑

不知道大家有没有玩过宝可梦神奇宝贝的RPG游戏,当时为了刷金币材料,大家都花了不少时间吧,市面上有些外挂,那么这些外挂是如何修改你的金币或者等级的呢?这就关乎到文件内容的配置了,用户设定修改的金币等级数,而作弊器直接定位到游戏内数据文件,读取用户修改的内容,并将这些值替换原来对应位置的值,从而实现。

但是呢这又和我们之前写过的覆盖等又有点不一样了!,当时是将整个覆盖或者部分覆盖,而没有具体覆盖哪一些,那我们今天看看能不能精确实现覆盖哪一些数值!

接下来我们就练手一下配置文件的修改,如:SPEED=5,LEVEL=99,COIN=1888....

这边我们先配置好一个test1.config文件

OK,来编写我们的代码:

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

int main(int argc,char **argv)
{
	int fdSrc;
	char *readBuf=NULL;  //初始化

	if(argc!=2){
	printf("pararm erroe!\n"); //命令数不等于2就不运行,对我们来说我们需要输入:./a.out test1.config就可以运行
	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,"SPEED=");  //使用man查看strstr使用方法,“”中为读取的项

	if(p==NULL){
	printf("NO FIND!");  //没读取到p
 	exit(-1);
	}	
	
	p=p+strlen("SPEED=");
	*p ='5'; //修改的数值
		
	int n_write=write(fdSrc,readBuf,strlen(readBuf)); //写入
	close(fdSrc);
	return 0;
}

 我们运行一下看看结果

修过过后的是这样的!它另起一行了!原因是什么,就是我们打开文本之后读取文本内容后再进行修改,既然读取了文本内容,那么一定是读到了文本内容尾部,那么光标理所当然也在尾部。这么看来光标的移动真的是每一位要使用Linux的兄弟们都必须学会的操作!

 回到正题,但是我不想让它另起一行来修改,我该怎么做呢?又是像之前一样,移动光标!

在写入操作前加上

lseek(fdSrc,0,SEEK_SET);

这次就没有问题啦! 

完成!

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值