C++学习之路(五)C++ 实现简单的文件管理系统命令行应用 - 示例代码拆分讲解

news2025/2/22 19:01:49

简单的文件管理系统示例介绍:

这个文件管理系统示例是一个简单的命令行程序,允许用户进行文件的创建、读取、追加内容和删除操作。这个示例涉及了一些基本的文件操作和用户交互。

在这里插入图片描述

功能概述:

  1. 创建文件 (createFile()):

    • 用户可以输入文件名和内容,创建新的文件。
  2. 读取文件 (readFile()):

    • 用户可以输入文件名,读取并显示文件的内容。
  3. 追加文件内容 (appendToFile()):

    • 用户可以输入文件名和内容,将新内容追加到已存在的文件末尾。
  4. 删除文件 (deleteFile()):

    • 用户可以输入文件名,删除指定的文件。

涉及的知识点:

  1. 文件输入输出 (<fstream>):

    • 使用 std::ifstreamstd::ofstream 实现文件读取和写入功能。
  2. 文件流的打开和关闭:

    • is_open()close() 函数用于检查文件流是否打开以及关闭文件。
  3. 命令行交互:

    • 使用 std::cinstd::cout 实现与用户的交互。
  4. 文件操作函数:

    • std::remove() 函数用于删除文件。
  5. 循环和条件语句:

    • 使用 do-while 循环处理菜单选项,根据用户输入的选择执行相应的功能。

通过这个示例,初学者可以了解如何使用 C++ 实现基本的文件操作、用户交互和函数封装,以及如何处理文件的创建、读取、追加和删除等操作。同时也涉及了条件语句、循环等基本的程序控制结构。

示例在Clion中运行步骤:

1. 新建项目

在这里插入图片描述

2. 粘贴代码
#include <iostream>
#include <fstream>
#include <string>

void createFile() {
    std::string filename, content;

    std::cout << "Enter filename: ";
    std::cin >> filename;

    std::ofstream file(filename);

    if (file.is_open()) {
        std::cout << "Enter file content (type 'end' to finish):\n";
        while (true) {
            std::cin.ignore(); // Ignore newline character from previous input
            std::getline(std::cin, content);
            if (content == "end") {
                break;
            }
            file << content << std::endl;
        }
        file.close();
        std::cout << "File created successfully!" << std::endl;
    } else {
        std::cout << "Error! Unable to create file." << std::endl;
    }
}

void readFile() {
    std::string filename, line;

    std::cout << "Enter filename to read: ";
    std::cin >> filename;

    std::ifstream file(filename);

    if (file.is_open()) {
        std::cout << "File content:" << std::endl;
        while (std::getline(file, line)) {
            std::cout << line << std::endl;
        }
        file.close();
    } else {
        std::cout << "Error! Unable to open file." << std::endl;
    }
}

void appendToFile() {
    std::string filename, content;

    std::cout << "Enter filename to append: ";
    std::cin >> filename;

    std::ofstream file(filename, std::ios::app);

    if (file.is_open()) {
        std::cout << "Enter content to append (type 'end' to finish):\n";
        while (true) {
            std::cin.ignore(); // Ignore newline character from previous input
            std::getline(std::cin, content);
            if (content == "end") {
                break;
            }
            file << content << std::endl;
        }
        file.close();
        std::cout << "Content appended to file successfully!" << std::endl;
    } else {
        std::cout << "Error! Unable to open file." << std::endl;
    }
}

void deleteFile() {
    std::string filename;

    std::cout << "Enter filename to delete: ";
    std::cin >> filename;

    if (std::remove(filename.c_str()) != 0) {
        std::cout << "Error! Unable to delete file." << std::endl;
    } else {
        std::cout << "File deleted successfully!" << std::endl;
    }
}

int main() {
    char choice;
    do {
        std::cout << "\nFile Management System\n";
        std::cout << "1. Create File\n";
        std::cout << "2. Read File\n";
        std::cout << "3. Append to File\n";
        std::cout << "4. Delete File\n";
        std::cout << "5. Exit\n";
        std::cout << "Enter your choice: ";
        std::cin >> choice;

        switch (choice) {
            case '1':
                createFile();
                break;
            case '2':
                readFile();
                break;
            case '3':
                appendToFile();
                break;
            case '4':
                deleteFile();
                break;
            case '5':
                std::cout << "Exiting...\n";
                break;
            default:
                std::cout << "Invalid choice!\n";
                break;
        }
    } while (choice != '5');

    return 0;
}

3. 编译运行

在这里插入图片描述


代码拆解,知识点总结

当我们拆分讲解这个文件管理系统示例时,可以按照功能模块来逐步解释每个部分的作用和实现。

🟥 1. 创建文件功能 (createFile()):

void createFile() {
    std::string filename, content;

    std::cout << "Enter filename: ";
    std::cin >> filename;

    std::ofstream file(filename);

    // 检查文件是否成功打开
    if (file.is_open()) {
        std::cout << "Enter file content (type 'end' to finish):\n";
        while (true) {
            std::cin.ignore(); // 忽略上一个输入中的换行符
            std::getline(std::cin, content);
            if (content == "end") {
                break;
            }
            file << content << std::endl;
        }
        file.close();
        std::cout << "File created successfully!" << std::endl;
    } else {
        std::cout << "Error! Unable to create file." << std::endl;
    }
}
  • 这个函数允许用户输入文件名和内容,在给定的文件名下创建文件并将用户输入的内容写入文件。
  • 使用 std::ofstream 打开文件,使用 file.is_open() 检查文件是否成功打开,然后读取用户输入的内容,并将内容写入文件。

🟥 2. 读取文件功能 (readFile()):

void readFile() {
    std::string filename, line;

    std::cout << "Enter filename to read: ";
    std::cin >> filename;

    std::ifstream file(filename);

    // 检查文件是否成功打开
    if (file.is_open()) {
        std::cout << "File content:" << std::endl;
        while (std::getline(file, line)) {
            std::cout << line << std::endl;
        }
        file.close();
    } else {
        std::cout << "Error! Unable to open file." << std::endl;
    }
}
  • 这个函数允许用户输入文件名,然后打开文件并将文件内容逐行读取并显示在屏幕上。

🟥 3. 追加文件内容功能 (appendToFile()):

void appendToFile() {
    std::string filename, content;

    std::cout << "Enter filename to append: ";
    std::cin >> filename;

    std::ofstream file(filename, std::ios::app);

    // 检查文件是否成功打开
    if (file.is_open()) {
        std::cout << "Enter content to append (type 'end' to finish):\n";
        while (true) {
            std::cin.ignore(); // 忽略上一个输入中的换行符
            std::getline(std::cin, content);
            if (content == "end") {
                break;
            }
            file << content << std::endl;
        }
        file.close();
        std::cout << "Content appended to file successfully!" << std::endl;
    } else {
        std::cout << "Error! Unable to open file." << std::endl;
    }
}
  • 这个函数允许用户输入文件名和内容,在给定的文件名下打开文件,并在文件末尾追加用户输入的内容。

📢 Tips: std::getline() 是什么意思?

std::getline() 是 C++ 标准库 <string> 头文件中的函数,用于从输入流中获取一行文本并存储到字符串中。

  • std::getline() 接受两个参数:输入流和字符串。
  • 它从输入流(在这个例子中是 std::cin,标准输入)中读取一行文本,并将读取的内容存储到字符串 line 中,直到遇到换行符 \n 或文件结束符。
  • 这个函数能够读取整行文本,包括空格和制表符等,直到换行符为止。

std::getline() 的特点:

  1. 读取整行文本: 不像 std::cin >> variable 会在遇到空格或换行符时停止读取,std::getline() 会读取整行文本。

  2. 可以指定定界符(可选): 可以传递第三个参数作为定界符,以指定特定的字符作为终止符号,例如 std::getline(std::cin, line, '\t') 将在遇到制表符时停止读取。

  3. 常用于读取用户输入: 在命令行交互中,特别适用于读取用户输入的完整一行文本,例如文件名、描述等信息。

std::getline() 是处理输入流中文本数据时常用的函数,能够方便地读取整行文本并存储到字符串中,适用于许多交互式的输入场景。


🟥 4. 删除文件功能 (deleteFile()):

void deleteFile() {
    std::string filename;

    std::cout << "Enter filename to delete: ";
    std::cin >> filename;

    // 删除文件
    if (std::remove(filename.c_str()) != 0) {
        std::cout << "Error! Unable to delete file." << std::endl;
    } else {
        std::cout << "File deleted successfully!" << std::endl;
    }
}
  • 这个函数允许用户输入文件名,然后尝试删除该文件。

🟥 5. 主函数 (main()):

主函数提供了用户和程序的交互菜单,根据用户的选择调用相应的功能函数。

整个程序通过以上几个模块,实现了文件的创建、读取、追加和删除等功能,并通过命令行菜单和用户输入来控制程序的执行。

Tips: 📢 别忘了跑起来,检查检查有没有BUG ~ 😁


本文就到这里了,感谢您的阅读,明天还有更多的实例学习文章等着你 🎆。别忘了点赞、收藏~ Thanks♪(・ω・)ノ 🍇。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1255675.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

计算机系统的层次结构与性能指标

目录 一. 计算机系统的层次结构二. 计算机性能指标2.1. 存储器的性能指标2.2 CPU的性能指标2.3 系统整体的性能指标2.4 系统整体的性能指标(动态测试) \quad 一. 计算机系统的层次结构 \quad \quad 虚拟机器的意思是看起来像是机器直接就能执行程序员所写的代码, 其实是需要通过…

Java王者荣耀

一、创建项目 二、代码 package com.sxt;import javax.swing.*; import java.awt.*;public class Background extends GameObject {public Background(GameFrame gameFrame) {super(gameFrame);// TODO Auto-generated constructor stub}Image bg Toolkit.getDefaultToolkit(…

基于helm的方式在k8s集群中部署gitlab - 备份恢复(二)

接上一篇 基于helm的方式在k8s集群中部署gitlab - 部署&#xff08;一&#xff09;&#xff0c;本篇重点介绍在k8s集群中备份gitlab的数据&#xff0c;并在虚拟机上部署相同版本的gitlab&#xff0c;然后将备份的数据进行还原恢复 文章目录 1. 备份2. 恢复到虚拟机上的gitlab2.…

java学习part13Object类和常用方法

1.Object 2.常用方法 2.1clone() clone()就是深拷贝&#xff0c;创建一个同内容新对象。需要实现接口 2.2finalize()已废弃 类似于析构函数&#xff0c;在GC回收之前调用。 System.gc()强制调用gc&#xff0c;然后就能看到finalize()的输出 2.3equals() 对于引用类型可用。…

帮管客CRM SQL注入漏洞复现

0x01 产品简介 帮管客CRM是一款集客户档案、销售记录、业务往来等功能于一体的客户管理系统。帮管客CRM客户管理系统&#xff0c;客户管理&#xff0c;从未如此简单&#xff0c;一个平台满足企业全方位的销售跟进、智能化服务管理、高效的沟通协同、图表化数据分析帮管客颠覆传…

Linux(8):BASH

硬件、核心与 Shell 操作系统其实是一组软件&#xff0c;由于这组软件在控制整个硬件与管理系统的活动监测&#xff0c;如果这组软件能被用户随意的操作&#xff0c;若使用者应用不当&#xff0c;将会使得整个系统崩溃。因为操作系统管理的就是整个硬件功能。 应用程序在最外层…

ELF分析(以CS:APP linkLab的文件为例)

文件结构&#xff1a;gcc -o test main.o phase1.o 可执行文件的段头表&#xff08;又称程序头表&#xff09;&#xff08;用于描述本文件到虚拟内存的映射&#xff09; text文件的段头表如下。 上图有两个LOAD。它们的区别是权限不同。LOAD1是可读可执行&#xff08;这里面存…

拍这个视频把脸都扇肿了,midjourney官网效果复现

我是如何复现midjourney官网首页效果的&#xff1f; 视频讲解地址&#xff1a;[https://www.bilibili.com/video/BV1FQ4y1p7HC/](https://www.bilibili.com/video/BV1FQ4y1p7HC/)原理&#xff0c;过程&#xff0c;代码讲解 大家好&#xff0c;这一集我来讲一下 字符花园里 总结…

ehr人力资源管理系统(实际项目源码)

eHR人力资源管理系统&#xff1a;功能强大的人力资源管理工具 随着企业规模的不断扩大和业务需求的多样化&#xff0c;传统的人力资源管理模式已无法满足现代企业的需求。eHR人力资源管理系统作为一种先进的管理工具&#xff0c;能够为企业提供高效、准确、实时的人力资源管理…

04_MySQL备份与恢复

任务背景 一、真实案例 某天&#xff0c;公司领导安排刚入职不久的小冯同学将生产环境中的数据(MySQL数据库)全部导入到测试环境给测试人员使用。当小冯去拿备份数据时发现&#xff0c;备份数据是1个礼拜之前的。原因是之前运维同事通过脚本每天对数据库进行备份&#xff0c;…

redis key

不管是&#xff1a;规则&#xff0c;还是其他规则&#xff0c;定义好就可以了。其实没有太多要求的。 1&#xff09;冒号分割类似那种yaml在客户端显示树结构 2&#xff09;其他分割类似那种properties在客户端显示列表结构

​重生奇迹mu迷宫攻略​

重生奇迹mu迷宫是一种比较有挑战性的游戏玩法&#xff0c;需要一定的技巧和策略才能完成。以下是一些基本的攻略和技巧&#xff1a; 了解每个迷宫的特点&#xff1a;不同的迷宫有不同的规则和特点&#xff0c;需要根据迷宫的特点来制定合理的策略。在进入迷宫前可以先了解一下…

Unity2D-URP基于ShaderGraph创建带粒子特效的激光光束

文章目录 创建Shader新建Node: UV新建Node: Split......参数说明 基于Shader创建Material创建Line创建粒子系统StartVFX创建粒子材质更改粒子系统的材质设置透明模式设置粒子效果创建一个Beam设置EndVFX效果预览激光光束管理脚本最终预览 创建Shader Create --> Shader Gra…

redis报错3

INFO: Initializing SpringDispatcherServletdispatcherServlet

思维模型 长尾效应

本系列文章 主要是 分享 思维模型&#xff0c;涉及各个领域&#xff0c;重在提升认知。小众需求大价值。 1 长尾效应的应用 1.1 长尾效应在电子商务领域的应用 亚马逊公司是全球最大的电子商务公司之一&#xff0c;它利用长尾效应来销售大量的小众产品&#xff0c;满足消费者…

5、Qt:项目中包含多个子项目(.pro)/子模块(.pri)

一、说明&#xff1a; 在进行项目开发过程中&#xff0c;会涉及子项目/子模块的问题 Qt中使用TEMPLATE subdirs添加多个子项目&#xff1b;子项目可以单独编译生成可执行文件&#xff08;exe&#xff09;或者动态链接库&#xff08;dll&#xff09;等&#xff0c;供其他模块…

redisserver一闪而过 redis闪退解决版本

1.进入Redis根目录 2.输入redis-server 或 redis-server.exe redis.windows.conf 启动redis命令&#xff0c;看是否成功。 执 一闪而过的问题 可能是因为已启动或者其他问题&#xff0c;需要重启 先输入redis-cli.exe再输入shutdown再输入redis-server.exe redis.windows.c…

[Matlab有限元分析] 2.杆单元有限元分析

1. 一维杆单元有限元分析程序 一维刚单元的局部坐标系&#xff08;单元坐标系&#xff09;与全局坐标系相同。 1.1 线性杆单元 如图所示是一个杆单元&#xff0c;由两个节点i和j&#xff0c;局部坐标系的X轴沿着杆的方向&#xff0c;由i节点指向j节点&#xff0c;每个节点有…

Redis面试题:Redis的数据淘汰策略有哪些?

目录 面试官&#xff1a;Redis的数据淘汰策略有哪些 ? 面试官&#xff1a;数据库有1000万数据 ,Redis只能缓存20w数据, 如何保证Redis中的数据都是热点数据 ? 面试官&#xff1a;Redis的内存用完了会发生什么&#xff1f; 面试官&#xff1a;Redis的数据淘汰策略有哪些 ? …