C++實現(xiàn)簡易文本編輯器
更新時間:2020年03月13日 07:44:29 作者:hmy_
這篇文章主要為大家詳細(xì)介紹了C++實現(xiàn)簡易文本編輯器,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
本文實例為大家分享了C++實現(xiàn)文本編輯器的具體代碼,供大家參考,具體內(nèi)容如下
1.簡易文本編輯器
2.用鏈表實現(xiàn),保存到文件中
#include<iostream>
#include<string>
#include<cstdlib>
#include<ctype.h>
#include<cstdio>
#include<fstream>
using namespace std;
int NumberCount=0;//數(shù)字個數(shù)
int CharCount=0;//字母個數(shù)
int PunctuationCount=0;//標(biāo)點符號個數(shù)
int BlankCount=0;//空白符個數(shù)
class Node
{
public:
string character;
int cursor;
int offset;
Node* next;
Node(){
cursor=0;//每行的光標(biāo)初始位置
offset=0;//每行的初始偏移位置
next=NULL;
}
};
class TextEditor
{
private:
Node* head;
string name;
int line;//可更改的行數(shù)
int length;//行數(shù)
public:
TextEditor();
~TextEditor();
string GetName();
void SetName(string name);
int GetCursor();
int MoveCursor(int offset);
int SetCursor(int line,int offset);
void AddText(const string s);
void InsertText(int seat,string s);
int FindText(string s);
void DeleteText(string s);
int GetLine();
void Count();
friend ostream& operator<<(ostream& out,TextEditor &text);
Node* Gethead(){
return head;
}
//int GetLength()
//{
// return length;
// }
// int FindText(string s);
// void DeleteText(int seat,string s);
};
TextEditor::TextEditor()
{
head=NULL;
name="test";//文件初始名
//tail=NULL;
line=1;
length=0;
}
TextEditor::~TextEditor()
{
Node* p=head;
Node* q;
while(p!=NULL){
q=p->next;
delete p;
p=q;
}
}
int TextEditor::GetLine()
{
return line;
}
string TextEditor::GetName()
{
return name;
}
void TextEditor::SetName(string name)
{
this->name=name;
}
int TextEditor::GetCursor()
{
Node *p=head;
while(p->next!=NULL)
p=p->next;
return p->cursor;
}
int TextEditor::MoveCursor(int offset)
{
Node *p=head;
int i=1;
if(length+1<line){
cout<<"輸入錯誤!"<<endl;
exit(0);
}
else{
while(p->next!=NULL&&i<line){
p=p->next;
i++;
}
}
if(offset>p->character.length()){
cout<<"移動位置太大!"<<endl;
exit(0);
}
else
p->cursor+=offset;
//cout<<"p ->cursor="<<p->cursor<<endl;
return p->cursor;
}
int TextEditor::SetCursor(int line,int offset)
{
this->line=line;
//cout<<"line="<<this->line<<endl;
return MoveCursor(offset);
}
void TextEditor::AddText(const string s)
{
line=length+1;
Node* p=new Node;
Node* q=head;
p->character=s;
p->next=NULL;
if(head==NULL)
head=p;
else{
while(q->next!=NULL)
q=q->next;
q->next=p;
}
length++;
// line++;
}
void TextEditor::InsertText(int seat,string s)
{
Node *p=head;
int i=1;
if(length+1<line){
cout<<"輸入錯誤!"<<endl;
exit(0);
}
else{
while(p->next!=NULL&&i<line){
p=p->next;
i++;
}
}
//MoveCursor(seat);
//cout<<"p->cursor="<<p->cursor<<endl;
string substr;
for(int i=seat;i<s.length()+seat&&i<=p->character.length();i++)
substr+=p->character[i];
p->character.insert(p->cursor,s);
cout<<"substr="<<substr<<endl;
DeleteText(substr);//覆蓋子串
p->cursor=0;//光標(biāo)清零
}
ostream& operator<<(ostream& out,TextEditor &text)
{
int i=1;
Node* p=text.Gethead();
while(p!=NULL){
out<<p->character<<endl;
p=p->next;
}
// cout<<"length="<<text.GetLength()<<endl;
return out;
}
int TextEditor::FindText(string P)
{
Node* q=head;
//int templine=1;
line=1;
int p=0;
int t=0;
int plen=P.length()-1;
//cout<<"P="<<P<<endl;
//cout<<"plen="<<plen<<endl;
int tlen=q->character.length();
while(q!=NULL){
p=0;
t=0;
tlen=q->character.length();
if(tlen<plen){
line++;
q=q->next;
}
while(p<plen&&t<tlen){
if(q->character[t]==P[p]){
t++;
p++;
}
else{
t=t-p+1;
p=0;
}
}
// cout<<"P="<<P<<endl;
// cout<<"p="<<p<<endl;
// cout<<"plen="<<plen<<endl;
if(p>=plen){
return t-plen+1;
}
else{
line++;
q=q->next;
}
}
return -1;
}
void TextEditor::DeleteText(string s)
{
Node *p=head;
int i=1;
int k=FindText(s);
if(k==-1)
cout<<"未出現(xiàn)該字符串!"<<endl;
else{
while(p!=NULL&&i<line){
p=p->next;
// cout<<p->character<<endl;
i++;
}
p->character.erase(k-1,s.length());
cout<<"刪除成功!"<<endl;
}
}
void TextEditor::Count()
{
Node *p=head;
NumberCount=0;
CharCount=0;
PunctuationCount=0;
BlankCount=0;
while(p!=NULL){
for(int i=0;i<p->character.length();i++){
if(p->character[i]>='0'&&p->character[i]<='9')
NumberCount++;
else if(p->character[i]>'a'&&p->character[i]<'z'||p->character[i]>'A'&&p->character[i]<'Z')
CharCount++;
else if(ispunct(p->character[i]))
PunctuationCount++;
else if(p->character[i]==' ')
BlankCount++;
}
p=p->next;
}
}
int main()
{
int i,j,k,n=2;
string s,t,name;
TextEditor text;
cout<<"---------------------------------------"<<endl;
cout<<"1.添加字符"<<endl;
cout<<"2.設(shè)置文檔名字"<<endl;
cout<<"3.獲取文檔名字"<<endl;
cout<<"4.顯示光標(biāo)位置"<<endl;
cout<<"5.設(shè)置光標(biāo)位置,在光標(biāo)位置處插入文本"<<endl;
cout<<"6.在文檔中查找文本"<<endl;
cout<<"7.在文檔中刪除文本"<<endl;
cout<<"8.統(tǒng)計字母、數(shù)字、標(biāo)點符號、空白符號及總字符個數(shù)"<<endl;
cout<<"9.輸入文本"<<endl;
cout<<"0.退出"<<endl;
while(n){
// cout<<endl;
cout<<endl;
cout<<"---------------------------------------"<<endl;
cout<<"請輸入:";
cin>>n;
getchar();
switch(n){
case 1: cout<<"請輸入字符:"; getline(cin,s,'\n'); text.AddText(s); break;
case 2: cout<<"請輸入文檔名字:"; cin>>name; text.SetName(name); break;
case 3: cout<<text.GetName()<<endl; break;
case 4: cout<<"光標(biāo)在第"<<text.GetLine()<<"行,第"<<text.GetCursor()<<"個字符前!"<<endl; break;
case 5:{
cout<<"輸入行數(shù):";
cin>>i;
cout<<"光標(biāo)在第"<<text.GetCursor()<<"個字符前!"<<endl;
cout<<"輸入移動位數(shù):";
cin>>j;
cout<<"輸入插入字符:";
getchar();
getline(cin,s);
text.InsertText(text.SetCursor(i,j),s); break;
}
case 6: {
cout<<"輸入查找的字符串:";
getline(cin,s);
int k=text.FindText(s);
if(k==-1)
cout<<"查找失敗!"<<endl;
else
cout<<"所查找文本首次出現(xiàn)在:"<<text.GetLine()<<"行,第"<<k<<"個字符處!"<<endl;
break;
}
case 7: cout<<"輸入要刪除的字符串:"; getline(cin,s); text.DeleteText(s); break;
case 8: {
text.Count();
cout<<"文檔中共有:"<<endl;
cout<<NumberCount<<"個數(shù)字"<<endl;
cout<<CharCount<<"個字母"<<endl;
cout<<PunctuationCount<<"個標(biāo)點符號"<<endl;
cout<<BlankCount<<"個空白字符"<<endl;
cout<<"共有"<<NumberCount+CharCount+PunctuationCount+BlankCount<<"個字符!"<<endl;
break;
}
case 9: cout<<text; break;
case 0:{
string ss=text.GetName();
ss+=".txt";
cout<<ss<<endl;
ofstream outFile(ss.c_str());
Node* p=text.Gethead();
while(p!=NULL){
outFile<<p->character<<endl;
p=p->next;
}
exit(0);
break;
}
default: cout<<"輸入錯誤,請重新輸入!"<<endl; break;
}
}
}
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
您可能感興趣的文章:
相關(guān)文章
C語言中求字符串長度的函數(shù)的幾種實現(xiàn)方法
這篇文章主要介紹了C語言中求字符串長度的函數(shù)的幾種實現(xiàn)方法,需要的朋友可以參考下2018-08-08
C++?Qt開發(fā)之關(guān)聯(lián)容器類使用方法詳解
當(dāng)我們談?wù)摼幊讨械臄?shù)據(jù)結(jié)構(gòu)時,順序容器是不可忽視的一個重要概念,Qt?中提供了豐富的容器類,用于方便地管理和操作數(shù)據(jù),本章我們將主要學(xué)習(xí)關(guān)聯(lián)容器,主要包括?QMap?,QSet和?QHash,感興趣的朋友跟著小編一起來學(xué)習(xí)吧2023-12-12
c++中將二維數(shù)組元素變換為逆向存放的實現(xiàn)代碼
編程將一個二維數(shù)組元素變換為逆向存放,即按元素在內(nèi)存中的物理排列位置,第一個元素變成倒數(shù)第一個元素,第二個元素變成倒數(shù)第二個元素,依此類推2020-11-11
C語言基礎(chǔ)之malloc和free函數(shù)詳解
這篇文章主要介紹了C語言基礎(chǔ)之malloc和free函數(shù)詳解的相關(guān)資料,需要的朋友可以參考下2017-04-04
C++ Boost PointerContainer智能指針詳解
智能指針是一種像指針的C++對象,但它能夠在對象不使用的時候自己銷毀掉。雖然STL提供了auto_ptr,但是由于不能同容器一起使用(不支持拷貝和賦值操作),因此很少有人使用。它是Boost各組件中,應(yīng)用最為廣泛的一個2022-11-11

