距离过年还有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);
这次就没有问题啦!
完成!