Linux文件之strstr函数、将一个整数,结构体和结构体数组写进文件里

Linux文件之strstr函数、将一个整数,结构体和结构体数组写进文件里linux

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

1.首先我们前面介绍了那么多关于文件的api,今天来记录一下strstr函数。
函数原型:

 char *strstr(const char *haystack, const char *needle);

返回值:返回一个char型的指针,(返回一个指针指向目的字符串开头位置的指针),如果没有找到的话,则返回NULL

作用:用于判断字符串needle是否是haystack的子串;如果是,则该函数返回needlehaystack中首次出现的地址;否则返回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;
}

学习笔记,仅供参考。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/184391.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • 二级反渗透1T/H二级反渗透纯水机 纯净水反渗透设备 反渗透设备

    反渗透技术原理反渗透技术是美国六十年代后期为解决宇航员在太空的饮水问题而研制的高新技术,也是目前的膜分离技术。简单地说,反渗透装置是利用半透膜在压力差的作用下使含盐水脱盐纯化的设备,它能有效地去除水中的无机盐、细菌、病毒、色素、热源、重金属离子及农药、化肥、清洁剂、胶体物质等污染物。反渗透膜孔径非常小,一般在2-10埃左右,而水中的各种离子杂质的直径约为几十埃,病毒、细菌的直径为几百至几十万埃,因此这些物质都是无法透过反渗透膜的,被截止在膜的浓水端,随浓水排出,透过反渗透膜的即是无菌,无毒害且富氧的纯净

  • expdp时遇到ORA-31693&amp;ORA-02354&amp;ORA-01466

    expdp时遇到ORA-31693&amp;ORA-02354&amp;ORA-01466

  • 对数似然值 matlab,matlab aic准则 怎么计算对数似然值

    对数似然值 matlab,matlab aic准则 怎么计算对数似然值匿名用户1级2016-11-22回答BIC需要三个inputs(LLF,numParams,numObs)*******************%AICBICAkaikeandBayesianinformationcriteriaformodelorderselection.%modelsoftheconditionalmeanandvariance…

  • ubuntu如何更新_ubuntu更新软件包列表命令

    ubuntu如何更新_ubuntu更新软件包列表命令ubuntu怎么更新?ubuntu更新命令及方法安装Ubuntu系统后,第一件事就是更新系统源。由于系统安装的默认源地址在英国,作为Ubuntu的主源,国内连接速度非常慢,所以我们要将它换成就近的

  • linux运维面试题总结「建议收藏」

    linux运维面试题总结「建议收藏」一、问答题1、安装linux系统对硬盘分区时,必须有那两种分区类型?2、简述raid0、raid1、raid5三种工作原理及特点3、linux下如何改ip,主机名,dns?4、一个ext3的文件分区,当使用touchtest.file命令创建一个新文件时报错,报错的信息是显示磁盘已满,但是采用df-h命令查看磁盘大小时,只使用了60%的磁盘空间,为什么会出现这个情况,说说你的理由5、…

  • python爬取网站m3u8视频,将ts解密成mp4,合并成整体视频「建议收藏」

    python爬取网站m3u8视频,将ts解密成mp4,合并成整体视频「建议收藏」一些网站会提供m3u8视频地址,以供下载观看。或者一些网站经过分析后发现是使用m3u8格式进行播放的,这时使用m3u8的地址链接就可以下载到相应的视频。一、关于m3u8:(https://blog.csdn.net/baidu_34418350/article/details/64922512)m3u8是苹果公司推出一种视频播放标准,是m3u的一种,不过编码方式是utf-8,是一种…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号