讲师中心 微信公众号

工具推荐

视频效率加速
updream

一键生成高质量推广成片

Laper
Laper

剧本策划到成片协作

Seko
Seko

AI短剧一键生成成片

剧云
剧云

中文短剧剧本制作平台

C++如何开发简单记事本程序

云涛君_3236

云涛君_3236

发布时间:2025-09-21 09:25:02

|

698人浏览过

|

来源于php中文网

原创

C++开发记事本程序的核心在于掌握文件I/O操作与字符串处理,适合从控制台版本入手以理解基础逻辑。通过实现文件读写,用std::string或std::vector存储文本内容,结合菜单系统实现打开、编辑、保存和退出功能。控制台版虽无图形界面,但能有效训练对系统资源和程序流程的掌控能力。若需图形界面,主流选择包括跨平台且功能全面的Qt、仅支持Windows的MFC、注重原生外观的wxWidgets,以及适用于Linux环境的GTKmm。C++的优势在于高性能和底层控制力,有助于深入理解操作系统机制,但挑战在于缺乏内置GUI支持、内存管理复杂及开发效率较低,因此更适合用于学习而非快速开发实用工具。

c++如何开发简单记事本程序

C++开发一个简单的记事本程序,核心在于掌握文件I/O操作(读写文件)和基本的字符串处理。你可以选择在控制台环境下实现,专注于文件内容管理;或者借助图形界面库,构建一个更接近日常使用的可视化应用。对于初学者而言,从控制台版本入手,理解其基本逻辑,是扎实的第一步。

要开发一个简单的记事本程序,我们通常会从控制台版本开始,因为它能让我们专注于核心的文件读写逻辑,而无需被复杂的图形界面细节分散注意力。

首先,我们需要处理文件。C++标准库中的

<fstream>
头文件提供了
ifstream
(输入文件流)和
ofstream
(输出文件流)来读写文件。一个最基本的记事本功能,无非就是“打开一个文件显示内容”、“新建一个文件并写入内容”以及“保存当前内容到文件”。

核心思路:

立即学习“C++免费学习笔记(深入)”;

  1. 菜单系统: 在控制台显示一个简单的菜单,让用户选择操作,比如“打开文件”、“新建/编辑文件”、“保存文件”、“退出”。
  2. 文件读取: 当用户选择打开文件时,程序会提示输入文件名,然后尝试用
    ifstream
    打开该文件。如果成功,就逐行读取文件内容并显示在屏幕上。
  3. 内容编辑: 对于新建或编辑功能,程序可以提供一个简单的输入界面。在控制台,这通常意味着用户可以输入多行文本,直到输入一个特定的结束符(比如单独的一行
    EOF
    或
    :
    quit)。程序将这些输入存储在一个
    std::string
    或
    std::vector<std::string>
    中。
  4. 文件保存: 当用户选择保存时,程序会提示输入保存的文件名。然后,使用
    ofstream
    打开文件,并将内存中的文本内容写入文件。

一个简单的控制台记事本骨架可能长这样:

#include <iostream>
#include <fstream>
#include <string>
#include <vector> // 可以用来存储多行文本

// 函数声明
void displayMenu();
void openFile(const std::string& filename);
void editFile(std::string& currentContent); // 允许编辑内存中的内容
void saveFile(const std::string& filename, const std::string& content);

int main() {
    std::string currentFilename = "";
    std::string currentContent = "";
    int choice;

    while (true) {
        displayMenu();
        std::cout << "请选择操作: ";
        std::cin >> choice;
        std::cin.ignore(); // 清除输入缓冲区中的换行符

        switch (choice) {
            case 1: { // 打开文件
                std::cout << "请输入要打开的文件名: ";
                std::getline(std::cin, currentFilename);
                openFile(currentFilename);
                // 实际应用中,这里应该将文件内容读入currentContent
                break;
            }
            case 2: { // 新建/编辑文件
                std::cout << "开始输入内容 (输入':'quit'结束):\n";
                editFile(currentContent);
                break;
            }
            case 3: { // 保存文件
                if (currentFilename.empty()) {
                    std::cout << "请输入要保存的文件名: ";
                    std::getline(std::cin, currentFilename);
                }
                saveFile(currentFilename, currentContent);
                break;
            }
            case 4: { // 退出
                std::cout << "感谢使用,再见!\n";
                return 0;
            }
            default: {
                std::cout << "无效的选择,请重试。\n";
                break;
            }
        }
        std::cout << "\n";
    }

    return 0;
}

void displayMenu() {
    std::cout << "--- 简单记事本 ---\n";
    std::cout << "1. 打开文件\n";
    std::cout << "2. 新建/编辑文件\n";
    std::cout << "3. 保存文件\n";
    std::cout << "4. 退出\n";
    std::cout << "------------------\n";
}

void openFile(const std::string& filename) {
    std::ifstream inputFile(filename);
    if (!inputFile.is_open()) {
        std::cerr << "错误:无法打开文件 " << filename << std::endl;
        return;
    }
    std::string line;
    std::cout << "--- 文件内容 ---\n";
    while (std::getline(inputFile, line)) {
        std::cout << line << std::endl;
    }
    std::cout << "--- 文件结束 ---\n";
    inputFile.close();
}

void editFile(std::string& currentContent) {
    currentContent.clear(); // 清空原有内容
    std::string line;
    while (std::getline(std::cin, line) && line != ":quit") {
        currentContent += line + "\n";
    }
    if (!currentContent.empty()) {
        currentContent.pop_back(); // 移除最后一个多余的换行符
    }
    std::cout << "内容已更新到内存中。\n";
}

void saveFile(const std::string& filename, const std::string& content) {
    std::ofstream outputFile(filename);
    if (!outputFile.is_open()) {
        std::cerr << "错误:无法保存文件 " << filename << std::endl;
        return;
    }
    outputFile << content;
    outputFile.close();
    std::cout << "文件已成功保存到 " << filename << std::endl;
}

这个例子只是一个非常基础的框架,

openFile
函数只是显示内容,并没有把内容读到
currentContent
里以便后续编辑。真正的“编辑”功能在控制台实现起来会比较笨拙,通常是让用户重新输入所有内容,或者通过行号进行替换。但它清晰地展示了文件I/O和用户交互的基本模式。

为什么选择C++开发记事本,它有什么优势和挑战?

选择C++来开发记事本程序,尤其是在学习阶段,确实有其独特的价值和挑战。从我的经验来看,C++的优势在于它提供了对系统资源的底层控制,这对于理解程序如何与操作系统、文件系统交互非常有帮助。你可以精确地控制内存分配、文件缓冲区,这在性能敏感的应用中至关重要。

优势:

  • 性能卓越: C++编译后的程序运行效率高,资源占用少,这对于处理大型文本文件或者需要快速响应的场景是有利的。
  • 深入理解系统: 通过C++进行文件I/O,你能够更深入地理解操作系统如何管理文件、缓冲区、流的概念,这对于构建更复杂的系统级应用是基础。
  • 强大的标准库: 尽管没有内置的GUI库,但C++标准库提供了强大的字符串处理(
    std::string
    )、容器(
    std::vector
    )和文件流(
    fstream
    )等工具,足以构建核心逻辑。
  • 广泛的第三方库支持: C++拥有庞大的生态系统,有许多成熟的GUI库(如Qt、MFC、wxWidgets)可以选择,一旦你掌握了核心逻辑,很容易扩展到图形界面。

挑战:

  • 缺乏原生GUI支持: 这是C++最明显的短板。如果你想做一个带有窗口、菜单、滚动条的记事本,你必须引入第三方GUI库,这会增加项目的复杂度和学习曲线。
  • 内存管理: 虽然现代C++(C++11及以后)通过智能指针等特性大大简化了内存管理,但在不熟悉的情况下,手动管理内存仍然是潜在的错误源。
  • 开发效率: 相较于Python、Java等语言,C++的开发周期可能会更长,尤其是在UI方面。编译时间也可能较长。
  • 错误处理: C++的错误处理机制(如异常)需要细致地设计和实现,否则程序容易崩溃。

总的来说,用C++开发记事本,更多的是为了学习和掌握其底层机制,而非追求快速开发一个功能完善的日常工具。它能让你对编程的本质有更深刻的认识。

JSON Toolkit
JSON Toolkit

JSON文件多功能工具。支持格式化、验证、压缩、键排序及点记法路径查询。零依赖。

下载

不使用图形界面库,如何实现一个可用的控制台记事本?

在不使用任何图形界面库的情况下,实现一个“可用”的控制台记事本,关键在于巧妙地利用控制台的输入输出特性,并对用户体验做一些妥协。它可能不会有鼠标点击、滚动条这些便利,但核心功能是能实现的。

  1. 文件读写操作:

    • 读取: 使用
      std::ifstream
      。打开文件后,可以用
      std::getline(inputFile, line)
      逐行读取文件内容,并存储在一个
      std::vector<std::string>
      中,以便后续显示和修改。
    • 写入: 使用
      std::ofstream
      。将内存中(
      std::vector<std::string>
      或
      std::string
      )的文本内容逐行写入文件。别忘了在每行后面加上
      \n
      。
    // 示例:从文件读取所有内容到string
    std::string readAllFromFile(const std::string& filename) {
        std::ifstream file(filename);
        if (!file.is_open()) {
            std::cerr << "无法打开文件: " << filename << std::endl;
            return "";
        }
        std::string content((std::istreambuf_iterator<char>(file)),
                             std::istreambuf_iterator<char>());
        file.close();
        return content;
    }
    
    // 示例:将string内容写入文件
    void writeAllToFile(const std::string& filename, const std::string& content) {
        std::ofstream file(filename);
        if (!file.is_open()) {
            std::cerr << "无法保存文件: " << filename << std::endl;
            return;
        }
        file << content;
        file.close();
    }
  2. 文本编辑功能:

    • 显示内容: 遍历存储文本的
      std::vector<std::string>
      ,逐行
      std::cout
      出来。为了方便用户定位,可以为每行加上行号。
    • 多行输入:
      std::getline
      一次只能读取一行。要实现多行输入,需要在一个循环中反复调用
      getline
      ,直到用户输入一个特定的“结束标记”(例如,单独一行输入
      :
      quit`)。
    • 简单的行编辑: 这部分是控制台记事本的难点。你无法像图形界面那样直接定位光标修改。
      • 替换整行: 让用户输入行号和新内容,然后修改
        std::vector<std::string>
        中对应索引的元素。
      • 插入行: 让用户输入行号和要插入的内容,使用
        std::vector::insert()
        方法。
      • 删除行: 让用户输入行号,使用
        std::vector::erase()
        方法。
    • 查找/替换: 可以实现简单的字符串查找(
      std::string::find
      )和替换(
      std::string::replace
      )功能,但用户体验会比较原始。
  3. 用户交互与菜单:

    • 通过
      std::cout
      显示菜单选项(打开、新建、编辑、保存、退出)。
    • 通过
      std::cin
      获取用户选择。
    • 使用
      switch
      语句根据用户的选择调用相应的函数。
    • 输入缓冲区处理: 在
      std::cin >> choice;
      之后,通常需要
      std::cin.ignore();
      来清除输入缓冲区中剩余的换行符,以防止影响后续的
      std::getline
      操作。

虽然控制台记事本在功能和用户体验上远不如图形界面版本,但它能有效地帮助你理解文件操作、字符串处理和程序逻辑构建,是学习C++基础的绝佳实践项目。

如果想让记事本程序有图形界面,C++有哪些主流选择?

当你的控制台记事本已经能够熟练地处理文件和文本逻辑后,自然会想让它拥有一个更友好的图形界面。C++本身不包含内置的GUI库,但得益于其强大的生态系统,有许多成熟且功能丰富的第三方库可供选择。选择哪个库,往往取决于你的项目需求、目标平台和个人偏好。

  1. Qt (发音:Cute):

    • 特点: 这是目前C++最流行、功能最全面的跨平台GUI框架之一。它不仅提供了一整套丰富的UI控件,还包含了网络、数据库、多线程、XML/JSON处理等模块。Qt使用自己的信号与槽机制来处理事件,非常强大和灵活。
    • 优势: 真正的跨平台(Windows, macOS, Linux, Android, iOS等),拥有强大的IDE(Qt Creator),丰富的文档和活跃的社区,支持QML进行声明式UI设计。
    • 劣势: 学习曲线相对陡峭,项目文件结构可能比较复杂,对新手来说可能需要一些时间适应。某些高级功能可能需要商业许可,但对于开源项目或学习目的,LGPL版本通常足够。
    • 适用场景: 几乎所有需要图形界面的C++应用,从桌面工具到嵌入式系统,Qt都能胜任。
  2. MFC (Microsoft Foundation Classes):

    • 特点: 这是微软为Windows平台提供的C++应用程序框架。它将Windows API封装成C++类,使得开发Windows桌面应用变得更加面向对象。
    • 优势: 与Windows系统深度集成,可以访问所有Windows特有的功能,对于仅 targeting Windows 平台的传统应用来说,仍然是一个选择。与Visual Studio集成良好。
    • 劣势: 仅限于Windows平台,不是跨平台的。框架设计相对老旧,学习曲线也比较陡峭,尤其是在理解消息循环和各种宏方面。
    • 适用场景: 主要用于开发传统的Windows桌面应用程序,或者维护现有的MFC项目。
  3. wxWidgets:

    • 特点: 另一个流行的跨平台GUI库。它最大的特点是尝试在不同操作系统上使用原生控件(native widgets),这意味着你的应用程序在Windows上看起来像Windows应用,在macOS上看起来像macOS应用,在Linux上看起来像GTK应用。
    • 优势: 跨平台,提供接近原生的用户体验,授权协议友好(wxWindows License,类似于LGPL),学习资源丰富。
    • 劣势: 功能不如Qt全面,有时在不同平台上的行为一致性可能需要额外调整。
    • 适用场景: 追求原生外观和跨平台支持的桌面应用。
  4. GTKmm:

    • 特点: GTK+(GNOME桌面环境的基础)的C++绑定。它提供了纯C++的API来构建GTK+应用程序。
    • 优势: 跨平台,与GTK+生态系统紧密结合,适合开发Linux桌面环境下的应用。
    • 劣势: 在Windows和macOS上的部署和主题化可能不如Qt或wxWidgets方便,社区主要集中在Linux平台。
    • 适用场景: 尤其适合开发基于GTK+的Linux桌面应用,或对GTK+有偏好的开发者。

选择哪个库,很大程度上取决于你对“简单”的定义以及未来的扩展性考虑。如果你的目标是学习和快速实现一个功能完备的记事本,并且希望它能运行在多个操作系统上,Qt通常是首选。如果仅仅是为了在Windows上体验一下,MFC也是一个选项,但它的时代感和非跨平台性可能会让你在未来遇到瓶颈。

热门AI工具

更多
SkildArt
SkildArt Hot

SkildArt是一款AI文本写作工具,一站式 AI 视觉创作平台。

SoundView
SoundView Hot

SoundView是一款面向跨境电商的视频翻译、配音和本地化 AI 创作平台。

蛙蛙写作

一款AI论文写作工具,主要用于超级AI智能写作助手,适合需要提升相关任务效率的用户。

咔片AIPPT

一款在线AI演示文稿制作工具,可根据主题和内容需求辅助生成PPT结构与页面,提高演示材料制作效率。

Laper
Laper Hot

Laper是专为编剧、导演和制片人推出的 AI 原生剧本创作工具。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

Lovart
Lovart Hot

一款面向视觉设计创作的AI设计平台,可通过智能体和画布工作流辅助制作海报、Logo、网页、PPT及其他视觉内容。

相关专题

更多
C++ Qt图形开发
C++ Qt图形开发

本专题专注于 C++ Qt框架在图形界面开发中的应用,系统讲解窗口设计、信号与槽机制、界面布局、事件处理、数据库连接与跨平台打包等核心技能,通过多个桌面应用项目实战,帮助学员快速掌握 Qt 框架并独立完成跨平台GUI软件的开发。

6122

2025.08.15

C++桌面程序开发
C++桌面程序开发

本专题聚焦 C++ 在桌面端图形界面应用开发中的实战应用,系统讲解 Qt 框架的信号与槽机制、界面布局管理、事件响应、数据交互、样式美化与多窗口应用设计等核心知识。通过实战案例(如记事本应用、数据管理工具、系统监控面板),帮助学习者掌握 从UI设计到完整桌面软件开发的C++工程化能力。

1574

2025.10.23

C++ 图形界面开发基础(Qt方向)
C++ 图形界面开发基础(Qt方向)

本专题系统讲解 使用 C++ 与 Qt 进行图形界面(GUI)开发的核心技能,内容涵盖 Qt 项目结构、窗口组件、信号与槽机制、事件处理、布局管理、资源管理,以及跨平台编译与打包流程。通过多个小型桌面应用实战案例,帮助学习者掌握从界面设计到功能实现的完整 GUI 开发能力。

1461

2025.12.05

json数据格式
json数据格式

JSON是一种轻量级的数据交换格式。本专题为大家带来json数据格式相关文章,帮助大家解决问题。

2335

2023.08.07

json是什么
json是什么

JSON是一种轻量级的数据交换格式,具有简洁、易读、跨平台和语言的特点,JSON数据是通过键值对的方式进行组织,其中键是字符串,值可以是字符串、数值、布尔值、数组、对象或者null,在Web开发、数据交换和配置文件等方面得到广泛应用。本专题为大家提供json相关的文章、下载、课程内容,供大家免费下载体验。

3842

2023.08.23

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

1276

2023.10.13

go语言处理json数据方法
go语言处理json数据方法

本专题整合了go语言中处理json数据方法,阅读专题下面的文章了解更多详细内容。

4479

2025.09.10

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

7519

2023.08.02

Go-Zero API开发使用教程
Go-Zero API开发使用教程

本专题聚焦Go-Zero的API开发,拆解.api描述文件的语法结构、路由与分组定义、参数绑定与校验规则,说明统一响应体、JWT鉴权、跨域与接口文档生成的落地方式,并给出网关聚合与接口测试的实践建议。

20

2026.11.12

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C++ Core Guidelines
C++ Core Guidelines

共0课时 | 0人学习

C++ Reference
C++ Reference

共0课时 | 0人学习

C++ 官方标准说明
C++ 官方标准说明

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn