在c语言编程中如何实现程序对文本文件中字符串进行替换及生成新的文本文件

 我来答
lwsmicc
2011-06-11 · TA获得超过258个赞
知道答主
回答量:359
采纳率:0%
帮助的人:213万
展开全部
我以前刚学C++的时候写过一个相似的程序,如果你要的是纯C语言下的编程,那么你就参考一下,这个算法的原理是一样的,即读入一个字符就显示出来。当然你也可以考虑其他实现方式。这个C++的程序中,和C语言区别的主要是有些输入和输出不太一样。还有system("pause")这个是调用系统暂停功能,可能在TC等编译环境下不能使用,可以考虑使用getch()替换。至于system("cls")是清屏。
相关功能函数为Display_text(),

#include<iostream>
#include<fstream>
#include <iomanip>
#include<windows.h>
using namespace std;

#define MaxSize 65535
int tag[100]; //匹配关键字的字符下标,设定最多找到100个关键字

typedef struct
{
char data[MaxSize]; //记录字符值
int len; //保存有效字符串长度
}SqString;

void MainMenu(); //显示主菜单
void Select_function(char op); //功能选择
void Display_text(); //显示本文内容
void Count_ch(); //统计字符数,空格数,行数
void Search_KeyWord(); //检索关键字
void Replace_KeyWord(); //替换关键字
void index(SqString s,SqString t); //简单匹配算法(BF)
void SetColor(unsigned short ForeColor,unsigned short BackGroundColor); //颜色函数

int main()
{
MainMenu();
return 0;
}

void MainMenu() //显示主菜单
{
char op;
cout<<"I——打开文本文件\n";
cout<<"T——统计\n";
cout<<"S——检索\n";
cout<<"R——替换\n";
cout<<"Q——退出\n\n";
cout<<"请选择:";
cin>>op;
Select_function(op);
}

void Select_function(char op) //功能选择
{
switch(op)
{
case 'i':
case 'I':Display_text();break;
case 't':
case 'T':Count_ch();break;
case 's':
case 'S':Search_KeyWord();break;
case 'r':
case 'R':Replace_KeyWord();break;
case 'q':
case 'Q':exit(0);
default:cout<<"输入错误,请重新选择"<<endl;
system("pause");system("cls");
MainMenu();
break;
}
}

void Display_text() //显示本文内容
{
int i=0;
char c,ch[150];
cout<<"请输入文件名:"<<endl;
cin>>ch;
system("cls");
ifstream infile;
infile.open(ch,ios::in);
if(!infile)
{
cerr<<"Open file error!"<<endl;
system("pause");system("cls");
MainMenu();
}
while(infile.get(c))
{
cout<<c;
i++;
if(i>=1000&&c=='\n'||i>=1500)
{
cout<<endl<<endl;
system("pause");system("cls");
i=0;
}
}
infile.close();
SetColor(11,8);
cout<<endl<<"文本内容结束!"<<endl;
SetColor(7,0);
system("pause");system("cls");
MainMenu();
}

void Count_ch() //统计字符数,空格数,段落数
{
int i=0,j=0,k=0;
char c,ch[150];
cout<<"请输入文件名:"<<endl;
cin>>ch;
system("cls");
ifstream infile;
infile.open(ch,ios::in);
if(!infile)
{
cerr<<"Open file error!"<<endl;
system("pause");system("cls");
MainMenu();
}
while(infile.get(c))
{
i++;
if(c==' ')j++;
if(c=='\n')k++;
}
infile.close();
SetColor(11,8);
cout<<"字符数:"<<i<<endl;
cout<<"空字符数"<<j<<endl;
cout<<"段落数(回车次数)"<<k<<endl;
SetColor(7,0);
system("pause");system("cls");
MainMenu();
}

void Search_KeyWord() //检索关键字
{
int i=0,j=0,k=0;
char c,ch[150],kw[50];
SqString s,t;
cout<<"请输入文件名:"<<endl;
cin>>ch;
system("cls");
ifstream infile;
infile.open(ch,ios::in);
if(!infile)
{
cerr<<"Open file error!"<<endl;
system("pause");system("cls");
MainMenu();
}
cout<<"请输入关键字:";
cin>>kw;
cout<<endl;
while(infile.get(c)&&i<MaxSize)
{
s.data[i]=c;i++;
}
s.len=i;
infile.close();
for(i=0;kw[i]!='\0';i++)
t.data[i]=kw[i];
t.len=i;
index(s,t);
if(tag[0]==-1)cout<<"无此关键字"<<endl;
else
{
for(i=0;i<=s.len;i++)
{
if(i==tag[j])
{
for(;i<tag[j]+t.len;i++)
{
SetColor(10,8);
cout<<s.data[i];
SetColor(7,0);
}
j++;
}
else cout<<s.data[i];
k++;
if(k>=1500&&s.data[i]=='\n'||k>=2000)
{
cout<<endl<<endl;
system("pause");system("cls");
k=0;
}
}
SetColor(11,8);
cout<<endl<<endl<<"文本内容结束!"<<endl;
SetColor(7,0);
}
system("pause");system("cls");
MainMenu();
}

void Replace_KeyWord() //替换关键字
{
int i=0,j=0,k=0;
char c,ch[150],kw[50],nkw[50];
SqString s,t,nt;
cout<<"请输入文件名:"<<endl;
cin>>ch;
system("cls");
ifstream infile;
infile.open(ch,ios::in);
if(!infile)
{
cerr<<"Open file error!"<<endl;
system("pause");system("cls");
MainMenu();
}
cout<<"请输入关键字:";
cin>>kw;
cout<<endl;
while(infile.get(c)&&i<MaxSize)
{
s.data[i]=c;i++;
}
s.len=i;
infile.close();
for(i=0;kw[i]!='\0';i++)
t.data[i]=kw[i];
t.len=i;
index(s,t);
if(tag[0]==-1)cout<<"无此关键字"<<endl;
else
{
cout<<"请输入新的字符替代原关键字:"<<endl;
cin>>nkw;
for(i=0;nkw[i]!='\0';i++)
nt.data[i]=nkw[i];
nt.len=i;

for(i=0;i<=s.len;i++)
{
if(i==tag[j])
{
for(int n=0;i<tag[j]+nt.len;i++,n++)
{
s.data[i]=nt.data[n];
SetColor(10,8);
cout<<s.data[i];
SetColor(7,0);
}
j++;
}
else cout<<s.data[i];
k++;
if(k>=1500&&s.data[i]=='\n'||k>=2000)
{
cout<<endl<<endl;
system("pause");system("cls");
k=0;
}
}

SetColor(11,8);
cout<<endl<<endl<<"文本内容结束!"<<endl;
SetColor(7,0);
}
fstream outfile(ch,ios::out);
if(!outfile)
{
cerr<<"Open file error!"<<endl;
system("pause");system("cls");
MainMenu();
}
for(i=0;i<=s.len;i++)
{
outfile<<s.data[i];
}
outfile.close();
system("pause");system("cls");
MainMenu();
}

void SetColor(unsigned short ForeColor,unsigned short BackGroundColor) //颜色函数
{
HANDLE hCon=GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleTextAttribute(hCon,(ForeColor%16)|(BackGroundColor%16*16));
}

void index(SqString s,SqString t) //简单匹配算法(BF)
{
int i=0,j=0,k=0;
h0: while(i<s.len&&j<t.len)
{
if(s.data[i]==t.data[j])
{
i++;j++;
}
else
{
i=i-j+1;j=0;
}

}
while(j>=t.len)
{
tag[k]=i-t.len;
k++;
i++;j=0;
goto h0;
}
if(k==0)tag[0]=-1;
}
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式