文本编辑器-字符串与文件的应用

一、引入问题:

二、代码:

 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;
} 

 三、测试:

 原文章:

替换后的文本存档: 

 

发布了69 篇原创文章 · 获赞 22 · 访问量 5997

猜你喜欢

转载自blog.csdn.net/Kevin__Coder/article/details/105134123