C++实现文本编辑功能

核心功能
  1. 文件管理

    • 新建空白文档
    • 打开现有文本文件
    • 保存当前编辑内容
  2. 文本编辑

    • 显示完整文本内容
    • 在指定位置插入新文本
    • 删除指定行
  3. 文本处理

    • 查找特定文本内容
    • 全局替换文本片段
用户体验
  • 交互式菜单界面,操作直观
  • 实时跟踪文件修改状态
  • 跨平台支持(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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值