核心功能
-
文件管理
- 新建空白文档
- 打开现有文本文件
- 保存当前编辑内容
-
文本编辑
- 显示完整文本内容
- 在指定位置插入新文本
- 删除指定行
-
文本处理
- 查找特定文本内容
- 全局替换文本片段
用户体验
- 交互式菜单界面,操作直观
- 实时跟踪文件修改状态
- 跨平台支持(Windows/Linux)
- 输入验证和错误提示
技术实现
- 使用
vector<string>
存储文本行 - 基于文件流实现文件读写
- 利用字符串查找和替换功能
- 简洁的类封装结构
这个编辑器提供了文本编辑的基本功能,代码结构清晰,适合作为学习 C++ 文件操作和字符串处理的实践案例。
#include <iostream>
#include <fstream>
#include <vector>
#include <string>
#include <cstdlib>
#include<bits/stdc++.h>
using namespace std;
// 清屏函数
void clrScr() {
#ifdef _WIN32
system("cls");
#else
system("clear");
#endif
}
// 暂停函数
void pause() {
cout << "\n按回车键继续...";
cin.ignore(numeric_limits<streamsize>::max(), '\n');
cin.get();
}
class TextEditor {
private:
vector<string> lines;
string fileName;
bool modified;
public:
TextEditor() : modified(false) {}
// 显示菜单
void showMenu() {
clrScr();
cout << "===== 简易文本编辑器 =====\n";
cout << "1. 新建文件\n";
cout << "2. 打开文件\n";
cout << "3. 保存文件\n";
cout << "4. 显示文本\n";
cout << "5. 插入文本\n";
cout << "6. 删除行\n";
cout << "7. 替换文本\n";
cout << "8. 查找文本\n";
cout << "0. 退出\n";
cout << "请选择: ";
}
// 新建文件
void newFile() {
if (modified) {
cout << "当前文件未保存,是否继续?(y/n): ";
char c;
cin >> c;
if (c != 'y' && c != 'Y') return;
}
lines.clear();
fileName = "";
modified = false;
cout << "已创建新文件\n";
pause();
}
// 打开文件
bool openFile() {
cout << "输入文件名: ";
string name;
cin >> name;
ifstream file(name);
if (!file.is_open()) {
cout << "无法打开文件: " << name << endl;
pause();
return false;
}
if (modified) {
cout << "当前文件未保存,是否继续?(y/n): ";
char c;
cin >> c;
if (c != 'y' && c != 'Y') {
file.close();
return false;
}
}
lines.clear();
string line;
while (getline(file, line)) {
lines.push_back(line);
}
file.close();
fileName = name;
modified = false;
cout << "已打开文件: " << name << endl;
pause();
return true;
}
// 保存文件
bool saveFile() {
if (fileName.empty()) {
cout << "输入文件名: ";
cin >> fileName;
}
ofstream file(fileName);
if (!file.is_open()) {
cout << "无法保存文件: " << fileName << endl;
pause();
return false;
}
for (const string& line : lines) {
file << line << endl;
}
file.close();
modified = false;
cout << "文件已保存: " << fileName << endl;
pause();
return true;
}
// 显示文本
void displayText() {
if (lines.empty()) {
cout << "文本为空\n";
pause();
return;
}
clrScr();
for (size_t i = 0; i < lines.size(); i++) {
cout << (i + 1) << ": " << lines[i] << endl;
}
pause();
}
// 插入文本
void insertText() {
int lineNum;
cout << "在第几行后插入? (0=开头): ";
cin >> lineNum;
if (lineNum < 0 || lineNum > (int)lines.size()) {
cout << "行号无效\n";
pause();
return;
}
cin.ignore();
cout << "输入文本 (空行结束):\n";
string text;
while (true) {
getline(cin, text);
if (text.empty()) break;
if (lineNum == 0) {
lines.insert(lines.begin(), text);
} else {
lines.insert(lines.begin() + lineNum, text);
lineNum++;
}
}
modified = true;
cout << "文本已插入\n";
pause();
}
// 删除行
void deleteLine() {
int lineNum;
cout << "删除第几行? (1-" << lines.size() << "): ";
cin >> lineNum;
if (lineNum < 1 || lineNum > (int)lines.size()) {
cout << "行号无效\n";
pause();
return;
}
lines.erase(lines.begin() + lineNum - 1);
modified = true;
cout << "行已删除\n";
pause();
}
// 替换文本
void replaceText() {
if (lines.empty()) {
cout << "文本为空\n";
pause();
return;
}
string oldText, newText;
cout << "要替换的文本: ";
cin.ignore();
getline(cin, oldText);
cout << "替换为: ";
getline(cin, newText);
int count = 0;
for (string& line : lines) {
size_t pos = 0;
while ((pos = line.find(oldText, pos)) != string::npos) {
line.replace(pos, oldText.length(), newText);
pos += newText.length();
count++;
}
}
if (count > 0) {
modified = true;
cout << "已替换 " << count << " 处\n";
} else {
cout << "未找到匹配文本\n";
}
pause();
}
// 查找文本
void findText() {
if (lines.empty()) {
cout << "文本为空\n";
pause();
return;
}
string text;
cout << "要查找的文本: ";
cin.ignore();
getline(cin, text);
bool found = false;
for (size_t i = 0; i < lines.size(); i++) {
if (lines[i].find(text) != string::npos) {
cout << (i + 1) << ": " << lines[i] << endl;
found = true;
}
}
if (!found) {
cout << "未找到匹配文本\n";
}
pause();
}
// 主循环
void run() {
int choice;
while (true) {
showMenu();
if (!(cin >> choice)) {
cout << "无效选择,请输入数字\n";
cin.clear();
cin.ignore(numeric_limits<streamsize>::max(), '\n');
pause();
continue;
}
switch (choice) {
case 0:
if (modified) {
cout << "文件未保存,是否退出?(y/n): ";
char c;
cin >> c;
if (c != 'y' && c != 'Y') continue;
}
clrScr();
cout << "感谢使用,再见!\n";
return;
case 1: newFile(); break;
case 2: openFile(); break;
case 3: saveFile(); break;
case 4: displayText(); break;
case 5: insertText(); break;
case 6: deleteLine(); break;
case 7: replaceText(); break;
case 8: findText(); break;
default:
cout << "无效选择,请重试\n";
pause();
break;
}
}
}
};
int main() {
TextEditor editor;
editor.run();
return 0;
}