文本编辑器-字符串与文件的应用
一、引入问题:
二、代码:
1. DevC++版本:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<fstream>
#include<vector>
using namespace std;
const int N=1e5+5;
vector<int> KMP(const string& S, const string& T)
{
int i=0,j=0;
vector<int> Next;
Next.push_back(-1);
for (i = 0, j = -1; i < T.size();) {
if (j == -1 || T[i] == T[j]) {
i++, j++;
if (i != T.size() && T[j] == T[i]) Next.push_back(Next[j]);
else Next.push_back(j);
}
else j = Next[j];
}
vector<int> res;
for (i = 0, j = 0; i < S.size() && j < (int)T.size();) {
if (j == -1 || S[i] == T[j]) {
i++, j++;
if (j == T.size()) {
res.push_back(i - j);
j = Next[j];
}
}
else j = Next[j];
}
return res;
}
//从文件中获取所有字符,存入char[]
void GetWords(char *a){
FILE *fp;
while( (fp = fopen("text.txt","r")) == NULL ) {
printf("不能打开文件text.txt\n");
return;
}
int index = 0;
char ch = fgetc(fp);
while(ch != EOF) {
a[index++] = ch;
ch = fgetc(fp);
}
a[index] = '\0';
}
int main() {
char a[100000];
cout<<"显示文章:"<<endl;
GetWords(a);
cout<<a<<endl<<endl;
while(1) {
cout<<"功能:1-查找,2-替换并存档"<<endl<<"请输入功能编号:";
int f;
cin>>f;
if(f==1){
std::string sc;
cout<<"请输入要查找的指定字符串:"<<endl;
cin>>sc;
string sf = a;
vector<int> v;
v = KMP(sf,sc);
cout<<"其出现次数:"<<v.size()<<endl;
// for(vector<int>::size_type i = 0; i != v.size(); i++) {
//
// }
// char sc[10000];
// cout<<"请输入要查找的指定字符串:"<<endl;
// cin>>sc;
// int len1 = strlen(sc);
// int len2 = strlen(a);
// cout<<"其出现次数:"<<kmp(len1,len2,sc,a)<<endl;
cout<<endl;
} else if(f==2){
int i=0;
string sc;
cout<<"请输入[被替换]的指定字符串"<<endl;
cin>>sc;
string sf = a;
vector<int> v;
v = KMP(sf,sc);
cout<<endl<<"找出子串在主串中出现的所有位置:";
for(vector<int>::size_type i = 0; i != v.size(); i++) {
cout<<v[i];
if(i != v.size()-1) cout<<",";
}
cout<<endl;
cout<<"请输入[替换]的指定字符串"<<endl;
string sn;
cin>>sn;
int lenc = sc.length();
int lenf = sf.length();
int lensn = sn.length();
string newText;
for( i=0;i<lenf;i++) {
int flag = 1;
for(vector<int>::size_type j = 0; j != v.size(); j++) {
if(v[j] == i) {
flag = 0; //表示当前为所有位置之一
break;
}
}
if(flag) newText += sf[i];
else {
newText += sn;
i+= (lensn-1);
}
}
cout<<endl<<"替换后的文章为:"<<endl;
cout<<newText<<endl;
FILE* fp = fopen("newtext.txt", "w");
int a = fwrite(newText.c_str(), sizeof(char), strlen(newText.c_str()), fp);
fclose(fp);//关闭文件并保存
cout<<"替换后的文章保存到newtext.txt成功!"<<endl;
cout<<endl;
} else if(f == -1){
break;
} else {
cout<<"请重新输入! "<<endl;
}
}
return 0;
}
2. VC++版本:(头文件string、string.h、cstring的不同是导致的原因之一。)
#include<iostream>
#include<cstdio>
#include<string>
#include<fstream>
#include<vector>
using namespace std;
const int N=1e5+5;
vector<int> KMP(const string& S, const string& T)
{
int i=0,j=0;
vector<int> Next;
Next.push_back(-1);
for (i = 0, j = -1; i < T.size();) {
if (j == -1 || T[i] == T[j]) {
i++, j++;
if (i != T.size() && T[j] == T[i]) Next.push_back(Next[j]);
else Next.push_back(j);
}
else j = Next[j];
}
vector<int> res;
for (i = 0, j = 0; i < S.size() && j < (int)T.size();) {
if (j == -1 || S[i] == T[j]) {
i++, j++;
if (j == T.size()) {
res.push_back(i - j);
j = Next[j];
}
}
else j = Next[j];
}
return res;
}
//从文件中获取所有字符,存入char[]
void GetWords(char *a){
FILE *fp;
while( (fp = fopen("text.txt","r")) == NULL ) {
printf("不能打开文件text.txt\n");
return;
}
int index = 0;
char ch = fgetc(fp);
while(ch != EOF) {
a[index++] = ch;
ch = fgetc(fp);
}
a[index] = '\0';
}
int main() {
char a[100000];
cout<<"显示文章:"<<endl;
GetWords(a);
cout<<a<<endl<<endl;
while(1) {
cout<<"功能:1-查找,2-替换并存档"<<endl<<"请输入功能编号:";
int f;
cin>>f;
if(f==1){
std::string sc;
cout<<"请输入要查找的指定字符串:"<<endl;
cin>>sc;
string sf = a;
vector<int> v;
v = KMP(sf,sc);
cout<<"其出现次数:"<<v.size()<<endl;
cout<<endl;
} else if(f==2){
//int i=0;
string sc;
cout<<"请输入[被替换]的指定字符串"<<endl;
cin>>sc;
string sf = a;
vector<int> v;
v = KMP(sf,sc);
cout<<endl<<"找出子串在主串中出现的所有位置:";
for(vector<int>::size_type i = 0; i != v.size(); i++) {
cout<<v[i];
if(i != v.size()-1) cout<<",";
}
cout<<endl;
cout<<"请输入[替换]的指定字符串"<<endl;
string sn;
cin>>sn;
int lenc = sc.length();
int lenf = sf.length();
int lensn = sn.length();
string newText;
for( i=0;i<lenf;i++) {
int flag = 1;
for(vector<int>::size_type j = 0; j != v.size(); j++) {
if(v[j] == i) {
flag = 0; //表示当前为所有位置之一
break;
}
}
if(flag) newText += sf[i];
else {
newText += sn;
i+= (lensn-1);
}
}
cout<<endl<<"替换后的文章为:"<<endl;
cout<<newText<<endl;
FILE* fp = fopen("newtext.txt", "w");
int a = fwrite(newText.c_str(), sizeof(char), strlen(newText.c_str()), fp);
fclose(fp);//关闭文件并保存
cout<<"替换后的文章保存到newtext.txt成功!"<<endl;
cout<<endl;
} else if(f == -1){
break;
} else {
cout<<"请重新输入! "<<endl;
}
}
return 0;
}
三、测试:
原文章:
替换后的文本存档: