1.首先我们前面介绍了那么多关于文件的api,今天来记录一下strstr
函数。
函数原型:
char *strstr(const char *haystack, const char *needle);
返回值:返回一个char
型的指针,(返回一个指针指向目的字符串开头位置的指针),如果没有找到的话,则返回NULL
。
作用:用于判断字符串needle
是否是haystack
的子串;如果是,则该函数返回needle
在haystack
中首次出现的地址;否则返回NULL
。
haystack
:将要被查找的目标字符串。
needle
:将要被查找的对象字符串。
上代码:
pstr = strstr(readBuf,"YTRE=");
if(pstr == NULL)
{
printf("faild to found\n");
exit(-1);
}
pstr = pstr + strlen("YTRE=");
*pstr = '7';
修改YTRE=后面的数字:在readBuf缓冲区中读取“YTRE=”的字符串的首位,并返回给指针pstr,指针接收到后进行指针的偏移“YTRE=”那么长的长度,再将偏移后的指针的位置的内容修改即可,最后写回原来的文件中。
直接上代码:
#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 argc, char **argv)
{
if(argc != 2)
{
printf("parameter error!!\n");
exit(-1);
}
int fd;
int fd_size;
char *readBuf = NULL;
char *pstr = NULL;
fd = open(argv[1],O_RDWR);
fd_size = lseek(fd,0,SEEK_END);
lseek(fd,0,SEEK_SET);
readBuf = (char *)malloc(sizeof(char)*fd_size+3);
read(fd,readBuf,fd_size);
pstr = strstr(readBuf,"YTRE=");
if(pstr == NULL)
{
printf("faild to found\n");
exit(-1);
}
pstr = pstr + strlen("YTRE=");
*pstr = '7';
lseek(fd,0,SEEK_SET);
write(fd,readBuf,fd_size);
close(fd);
return 0;
}
进行函数封装的优化:
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
char* change(char *read,char *str)
{
char *pstr = NULL;
pstr = strstr(read,str);
if(pstr == NULL)
{
printf("Sorry ,faild to found\n");
exit(-1);
}
pstr = pstr + strlen(str);
*pstr = '3';
return pstr;
}
int main(int argc, char **argv)
{
if(argc != 2)
{
printf("parameter error!!\n");
exit(-1);
}
int fd;
int fd_size;
char *readBuf = NULL;
char *pstr = NULL;
fd = open(argv[1],O_RDWR);
fd_size = lseek(fd,0,SEEK_END);
lseek(fd,0,SEEK_SET);
readBuf = (char *)malloc(sizeof(char)*fd_size+3);
read(fd,readBuf,fd_size);
pstr = change(readBuf,"YTRE=");
lseek(fd,0,SEEK_SET);
write(fd,readBuf,fd_size);
close(fd);
return 0;
}
2.分别将一个整数,结构体和结构数组写进文件里。
(1)将一个整数写进文件里,直接上代码:
#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;
int data1 = 10;
int data2;
fd = open("./file1",O_RDWR);
write(fd,&data1,sizeof(int));
lseek(fd,0,SEEK_SET);
read(fd,&data2,sizeof(int));
printf("read:%d\n",data2);
close(fd);
return 0;
}
(2)将一个结构体写进文件里
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
struct Test
{
char a;
int ab;
};
int main()
{
int fd;
struct Test data1 = {
'd',15};
struct Test data2;
fd = open("./file1",O_RDWR);
write(fd,&data1,sizeof(struct Test));
lseek(fd,0,SEEK_SET);
read(fd,&data2,sizeof(struct Test));
printf("read:%c, %d\n",data2.a,data2.ab);
close(fd);
return 0;
}
(3)将一个结构体数组写进文件里 直接上代码:
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
struct Test
{
char a;
int ab;
};
int main()
{
int fd;
struct Test data1[2] = {
{
'd',15},{
'a',13}};
struct Test data2[2];
fd = open("./file1",O_RDWR);
write(fd,data1,sizeof(struct Test)*2);
lseek(fd,0,SEEK_SET);
read(fd,data2,sizeof(struct Test)*2);
printf("read: %c, %d\n",data2[0].a,data2[0].ab);
printf("read: %c, %d\n",data2[1].a,data2[1].ab);
close(fd);
return 0;
}
学习笔记,仅供参考。
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/184391.html原文链接:https://javaforall.cn