c语言字符串如何从文件中查找指定的字符,然后替换它?

C语言实现修改文本文件中特定行的实现代码
字体:[ ] 类型:转载 时间:
最近由于项目需要实现修改文件的功能,所以,博主认真查阅了一些资料,但是,很遗憾,并没有太多的收获
好的,首先我先叙述下功能要求:其实很简单,就是Shell中sed命令的C语言实现,实现定位到所需要的字段的那一行,之后修改成需要的内容。但是由于C语言是面向过程的语言,需要顺序执行的特点,所以,实现中遇到了很多麻烦,在这里博主将实现的过程描述如下,以便大家参考。
问题描述:
文本内容: 代码如下:wireless.1.authmode=1pression=0wireless.1.current_ap=ssid12wireless.1.current_state=1wireless.1.devname=ath0wireless.1.enable_slave1_status=disabledwireless.1.enable_slave2_status=disabledwireless.1.enable_slave3_status=disabled
我需要做的就是修改第四行的内容,使之变为:
代码如下:wireless.1.current_state=0
问题看似简单,实现过程颇费周折。。。
这里我给出实现的代码,注释已经加在代码中:
代码如下:/*&* Author:DLUTBruceZhang&* Date: &*/#include&stdio.h&#include&stdlib.h&#include&string.h&#include&unistd.h&int main(){&/*& *linebuffer:读取文件中的一行存入的缓冲& *buffer1:一行中第一个字段的存入缓冲& *buffer2:一行中第二个字段的存入缓冲& */&char linebuffer[512] = {0};&char buffer1[512] = {0};&char buffer2[512] = {0};&int line_len = 0;&int len = 0;&&/*& * cc.cfg是文件名,r+代表可以读写文件& */&FILE *fp = fopen("cc.cfg", "r+");&if(fp == NULL)&{&&printf("open error");&&return -1;&}&while(fgets(linebuffer, 512, fp))&{&&line_len = strlen(linebuffer);&&len += line_&&/*&& * buffer1=wireless.1.current_state&& * buffer2=1&& */&&sscanf(linebuffer, "%[^=]=%[^=]", buffer1,buffer2);&&if(!strcmp("wireless.1.current_state", buffer1))&&{&&&/*&&& * 由于已经找到所需要写的位置,所以需要写位置的“头”&&& */&&&len -= strlen(linebuffer);&&&/*&&& * 实现文件位置的偏移,为写文件做准备&&& */&&&res = fseek(fp, len, SEEK_SET);&&&if(res & 0)&&&{&&&&perror("fseek");&&&&return -1;&&&}&&&strcpy(buffer2, "=0");&&&/*strcat(buffer1, "=");*/&&&strcat(buffer1, buffer2);&&&printf("%d",strlen(buffer1));&&&/*&&& * 写文件,存入所需的内容&&&&&& */&&&fprintf(fp, "%s", buffer1);&&&fclose(fp);&&&&&}&}return 0;}
保存文件名为:my_sed.c
运行效果如下:
我们再来看文件中的内容已经变为:
代码如下: wireless.1.authmode=1 pression=0 wireless.1.current_ap=ssid12 wireless.1.current_state=0 wireless.1.enable_slave1_status=disabled wireless.1.enable_slave2_status=disabled wireless.1.enable_slave3_status=disabled
实现原理: 这里实现的效率比较高,因为不是把整个文件的内容装入缓冲区中,而是一行一行的读取,知道匹配为止,之后利用写文件的特性,直接覆盖所写内容即可,由此完成所需功能
您可能感兴趣的文章:
大家感兴趣的内容
12345678910
最近更新的内容
常用在线小工具查看: 7614|回复: 10|关注: 0
MATLAB如何实现在txt文本中查找指定字符并替换
<h1 style="color:# 麦片财富积分
新手, 积分 5, 距离下一级还需 45 积分
我想实现查找一个txt文本中某个字字出现的所有句子,并把它替换成另一个字,然后输出成一个新的txt文件存在相同的目录里
不太会写,求大神帮忙改一下
prompt = {'输入要替换的字:','输入要替换成的字:'};
dlg_title = '请输入要替换的单字';
num_lines = 1;
answer = inputdlg(prompt,dlg_title,num_lines);
check1=inputdlg('输入要替换的字:',1)
check2=inputdlg('输入要替换成的字:',2)
fidr = fopen('*.txt','rt');
handles.text=textread(filenameandpath,'%s');
fidw = fopen('*1.txt','wt');
& &&&for line=1:1:lastline(1) %从第一行开始到最后一行
& & curline=handles.text{line};
&&lastword=size(curline);
& & for i=1:1:lastword(2)%从本行第一个字开始检索
& &&&while ~feof(fidr)
& &&&s = fgetl(fidr);
& &&&s = strrep(s,'check1','check2');& &
& &&&fprintf(fidw,'%s\n',s);
fclose(fidr);
fclose(fidw);
论坛优秀回答者
帖子最佳答案
关注者: 210
这个是你自己写的吗?一开始吧文件都读了,然后再这是开始读字的时候又开始读行,逻辑很乱
我已经给了你一个例子了,在这里
自己跟着一步一步做一下
<h1 style="color:# 麦片财富积分
这个是你自己写的吗?一开始吧文件都读了,然后再这是开始读字的时候又开始读行,逻辑很乱
我已经给了你一 ...
你的例子只能针对在.m文件里的写的把X替换成Y,我也试过了,是可以实现的,但是我想实现在GUI界面按一个按钮出来一个窗口,你输入你要替换的字然后全文都可以替换,就不是特定的字,需要用户输入。
论坛优秀回答者
帖子最佳答案
关注者: 210
本帖最后由 honglei.chen 于
23:02 编辑
你的例子只能针对在.m文件里的写的把X替换成Y,我也试过了,是可以实现的,但是我想实现在GUI界面按一个 ...
如果我的理解没有错的话,你要的就是相当于要用户来输入我的例子里的x或者y,所以只要把x和y换成你得到的字符串就可以了不是吗?下面替换的方法是一样的。
比如原来是strrep(s,'x','y'),现在无非就是strrep(s,s1,s2),其中s1,s2是你的输入
这就好像如果你要烧水,你需要接了水,再烧,你总不能说从盆里打的水会烧,从水龙头打一壶水就不会烧了吧
<h1 style="color:# 麦片财富积分
如果我的理解没有错的话,你要的就是相当于要用户来输入我的例子里的x或者y,所以只要把x和y换成你得到的 ...
恩恩,我知道,那我想问一下我要输入的那个界面写得对吗?
这样写可以吗?
prompt = {'输入要替换的字:','输入要替换成的字:'};
dlg_title = '请输入要替换的单字';
num_lines = 1;
answer = inputdlg(prompt,dlg_title,num_lines);
check1=inputdlg('输入要替换的字:')
check2=inputdlg('输入要替换成的字:')
fidr = fopen('*.txt','rt');
handles.text=textread(filenameandpath,'%s');
fidw = fopen('*1.txt','wt');
& &&&while ~feof(fidr)
& &&&s = fgetl(fidr);
& &&&s = strrep(s,'check1','check2');& &
& &&&fprintf(fidw,'%s\n',s);
fclose(fidr);
fclose(fidw);
论坛优秀回答者
帖子最佳答案
关注者: 210
恩恩,我知道,那我想问一下我要输入的那个界面写得对吗?
这样写可以吗?
prompt = {'输入要替换的字:', ...
你的check1,check2已经包含了所需要的字符串了,所以不需要引号。引号的意思就是check1这个字符串本身了,而不是它所包含的字符串
strrep(s,check1,check2)
<h1 style="color:# 麦片财富积分
你的check1,check2已经包含了所需要的字符串了,所以不需要引号。引号的意思就是check1这个字符串本身了 ...
你好我还想问一下,我的check1、check2这样可以指代输入界面的两行吗?
然后你的例子里是特定的文件,我想写的是任意的txt文件,所以直接写*.txt 可以吗?我之前有弄一个按钮来打开文件是textread函数,可以连接在一起吗?怎么连在一起?
<h1 style="color:# 麦片财富积分
你的check1,check2已经包含了所需要的字符串了,所以不需要引号。引号的意思就是check1这个字符串本身了 ...
明天是我交作业的截止,麻烦你再帮我一下。你有空就回复我,谢谢
论坛优秀回答者
帖子最佳答案
关注者: 210
你好我还想问一下,我的check1、check2这样可以指代输入界面的两行吗?
然后你的例子里是特定的文件,我 ...
输入界面的两行就不一样了,但是你可以先读进来再分开。我不知道你所谓的*.txt是什么,但是你一次只能打开一个文件。如果你只是想要查找一个文件,你可以用uigetfile来实现。至于textread,可以连在一起。textread就已经把文件读入了,所以你只需要对textread的返回值按行处理再写入新文件就行了。不过我觉得你的问题textscan可能更合适
<h1 style="color:# 麦片财富积分
输入界面的两行就不一样了,但是你可以先读进来再分开。我不知道你所谓的*.txt是什么,但是你一次只能打 ...
输入界面的两行就不一样了,但是你可以先读进来再分开。这个是怎么操作?我不会
我想check1指代要替换的字,check2指代替换成的字
怎么样可以实现
站长推荐 /3
使用MATLAB和Simulink进行软件无线电设计
Powered byC语言strchr()函数:查找某字符在字符串中首次出现的位置_C语言中文网
&&/&&&&/&&&&/&&
头文件:#include &string.h&
strchr() 用来查找某字符在字符串中首次出现的位置,其原型为:
& & char * strchr (const char *str, int c);
【参数】str 为要查找的字符串,c 为要查找的字符。
strchr() 将会找出 str 字符串中第一次出现的字符 c 的地址,然后将该地址返回。
注意:字符串 str 的结束标志 NUL 也会被纳入检索范围,所以 str 的组后一个字符也可以被定位。
【返回值】如果找到指定的字符则返回该字符所在地址,否则返回 NULL。
返回的地址是字符串在内存中随机分配的地址再加上你所搜索的字符在字符串位置。设字符在字符串中首次出现的位置为 i,那么返回的地址可以理解为 str + i。
提示:如果希望查找某字符在字符串中最后一次出现的位置,可以使用
【实例】查找字符5首次出现的位置。
#include &stdio.h&
#include &stdlib.h&
#include &string.h&
int main(){
&&& char *s = &4567890&;
&&& char *p;
&&& p = strchr(s, &#39;5&#39;);
printf(&%ld\n&, s);
&&& printf(&%ld\n&, p);
system(&pause&);
&&& return 0;
输出结果:
推荐文章 TOP10}

我要回帖

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信