当前位置: 首页 > news >正文

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

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

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

在这里插入图片描述

功能概述:

  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 inputstd::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 inputstd::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♪(・ω・)ノ 🍇。

相关文章:

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

简单的文件管理系统示例介绍: 这个文件管理系统示例是一个简单的命令行程序&#xff0c;允许用户进行文件的创建、读取、追加内容和删除操作。这个示例涉及了一些基本的文件操作和用户交互。 功能概述&#xff1a; 创建文件 (createFile())&#xff1a; 用户可以输入文件名和内…...

Node.js下载安装及配置镜像源

一、进入官网地址下载安装包 https://nodejs.org/dist 选择对应你系统的Node.js版本 这里我选择的是Windows系统、64位 二、安装程序 &#xff08;1&#xff09;下载完成后&#xff0c;双击安装包&#xff0c;开始安装Node.js (2)直接点【Next】按钮&#xff0c;此处可根据…...

RAC 下expdp impdp 并行 parallel FK

1. dump 文件非共享下的并行 Customer receives the following errors: ORA-31693: Table data object "<SCHEMA_NAME>"."<TABLE_NAME>" failed to load/unload and is being skipped due to error: ORA-31617: unable to open dump file &qu…...

【数据结构】动态顺序表详解

目录 1.顺序表的概念及结构 2.动态顺序表的实现 2.1创建新项目 2.2动态顺序表的创建 2.3接口的实现及测其功能 2.3.1初始化 2.3.2尾插 2.3.3头插 2.3.4尾删&头删 2.3.5打印&从任意位置插入 2.3.6删除任意位置的数据 2.3.7查找 2.3.8销毁顺序表 3.结语 He…...

Nginx代理https请求的操作过程

理论很简单&#xff0c;过程很曲折&#xff0c;版本适配的问题要小心。 场景&#xff1a; 要和前端进行联调&#xff0c;我本地后端用了https&#xff0c;证书是自制的&#xff0c;主要是页面里面有一些oauth2认证的地方&#xff0c;需要跳转。 比如https://aaa.com/profile.h…...

Linux 面试题(一)

目录 1、绝对路径用什么符号表示&#xff1f;当前目录、上层目录用什么表示&#xff1f;主目录用什么表示? 切换目录用什么命令&#xff1f; 2、怎么查看当前进程&#xff1f;怎么执行退出&#xff1f;怎么查看当前路径&#xff1f; 3、怎么清屏&#xff1f;怎么退出当前命…...

HIVE SQL取整函数汇总

目录 int()round(double a)round(double a,int d)floor()ceil() int() 向零取整&#xff0c;即向接近零的方向取整。 int(5.6)输出&#xff1a;5 int(-5.6)输出&#xff1a;-5 round(double a) 四舍五入取整 select round(5.6)输出&#xff1a;6 select round(-5.6)输出&…...

VMware 虚拟机设置静态IP

1.桥接模式&#xff1a;无线网卡虚拟机可以桥接的&#xff0c;Vmware0是虚拟机默认进入的虚拟网络&#xff0c;打开虚拟网络编辑器把Vmware0桥接到具体的无线网卡上&#xff0c;再打开网卡设置选择桥接模式即可。 2、.NAT模式下 &#xff1a;window下VMnet8: IPv4 地址 . . . …...

pandas 如何获取dataframe的行的数量

pandas的dataframe提供了多种方法获取其中数据的行的数量&#xff0c;本偏文章就是介绍几种获取dataframe行和列出量的方法。 为了能够详细说明如何通过代码获取dataframe的行数和列数&#xff0c;需要先创建一个dataframe如下&#xff1a; import pandas as pdtechnologies …...

css实现图片绕中心旋转,鼠标悬浮按钮炫酷展示

vue模板中代码 <div class"contentBox clearfix home"><div class"circle"><img class"in-circle" src"../../assets/img/in-circle.png" alt""><img class"out-circle" src"../../as…...

C++11的线程

线程的创建 用std::thread创建线程非常简单&#xff0c;只需要提供线程函数或者线程对象即可&#xff0c;并可以同时指定线程函数的参数。下面是创建线程的示例&#xff1a; #include <thread> #include <iostream> using namespace std;void func() {cout <<…...

Deepmind开发音频模型Lyria 用于生成高品质音乐;创建亚马逊新产品评论摘要

&#x1f989; AI新闻 &#x1f680; Deepmind开发音频模型Lyria 用于生成高品质音乐 摘要&#xff1a;Deepmind推出名为Lyria的音频模型&#xff0c;可生成带有乐器和人声的高品质音乐。Lyria模型针对音乐生成的挑战&#xff0c;解决了音乐信息密度高、音乐序列中的连续性维…...

Liunx系统使用超详细(一)

目录 一、Liunx系统的认识 二、Liunx和Windows区别 三、Liunx命令提示符介绍 四、Liunx目录结构 一、Liunx系统的认识 Linux系统是一种开源的、类Unix操作系统内核的实现&#xff0c;它基于Unix的设计原理和思想&#xff0c;并在全球范围内广泛应用。以下是对Linux系统的详…...

C语言标准

1、概述 C语言标准是由ANSI&#xff08;美国国家标准协会&#xff09;和ISO&#xff08;国际标准化组织&#xff09;共同制定的一种语言规范。标准经历过如下更新&#xff1a; C89/C90标准C99标准C11标准C17标准 2、C89/C90标准 (1)这是1989年正式发布的C语言标准&#xff0…...

TI 毫米波雷达开发系列之mmWave Studio 和 Visuiallizer 的异同点雷达影响因素分析

TI 毫米波雷达开发之mmWave Studio 和 Visuiallizer 的异同点 引入整个雷达系统研究的目标分析影响这个目标的因素硬件影响因素 —— 雷达系统的硬件结构&#xff08;主要是雷达收发机&#xff09;AWR1642芯片硬件系统组成MSS 和 DSS 概述MSS 和 DSS 分工BSS的分工AWR1642 组成…...

SpringBoot事务处理

一、事务回顾 回顾地址&#xff1a; 深入理解数据库事务&#xff08;超详细&#xff09;_数据库事务操作_Maiko Star的博客-CSDN博客 事务&#xff1a; 是一组操作的集合&#xff0c;是一个不可分割的工作单位&#xff0c;这些操作要么同时成功&#xff0c;要么同时失败 事…...

网络安全—自学

1.网络安全是什么 网络安全可以基于攻击和防御视角来分类&#xff0c;我们经常听到的 “红队”、“渗透测试” 等就是研究攻击技术&#xff0c;而“蓝队”、“安全运营”、“安全运维”则研究防御技术。 2.网络安全市场 一、是市场需求量高&#xff1b; 二、则是发展相对成熟…...

首页以卡片形式来展示区块链列表数据(Web3项目一实战之五)

我们已然在 Web3 分布式存储 IPFS(Web3项目一实战之四) 介绍了什么是IPFS,以及在本地电脑如何安装它。虽然在上一篇讲解了该怎么安装IPFS,也做了相应的配置,但在本地开发阶段,前端总是无法避免跨域这个远程请求api的”家常便饭的通病“。 很显然,对于出现跨域这类常见问…...

opencv使用pyinstaller打包错误:‘can‘t find starting number (in the name of file)

使用Python语言和opencv模块在pycharm中编辑的代码运行没问题&#xff0c;但是在使用pyinstaller打包后出现错误can‘t find starting number (in the name of file) [ERROR:0] global C:\Users\runneradmin\AppData\Local\Temp\pip-req-build-q3d_8t8e\opencv\modules\videoi…...

4.一维数组——用数组处理求Fibonacci数列前20项

文章目录 前言一、题目描述 二、题目分析 三、解题 程序运行代码 四、结果显示 前言 本系列为一维数组编程题&#xff0c;点滴成长&#xff0c;一起逆袭。 一、题目描述 用数组处理求Fibonacci数列前20项 二、题目分析 前两项&#xff1a;f[20]{1,1} 后18项&#xff1a;for(…...

EF Core 拦截器实战:SaveChangesInterceptor、CommandInterceptor 与审计落地缕

一、背景与问题缘起 MySQL 5.6.51 版本下 2000 万行核心业务表开展新增字段操作&#xff0c;需求为新增BIGINT(19) NOT NULL DEFAULT 0 COMMENT 注释&#xff08;因业务实际需要存储大数值关联字段&#xff09;。 表的核心特性为Java 多线程密集读写&#xff0c;业务请求持续高…...

STM32 NVIC优先级设置详解:以红外传感器计数为例

STM32 NVIC优先级设置详解&#xff1a;以红外传感器计数为例 在嵌入式系统开发中&#xff0c;中断管理是确保实时响应和系统稳定性的核心机制。STM32微控制器凭借其强大的NVIC&#xff08;嵌套向量中断控制器&#xff09;为开发者提供了灵活的中断优先级配置方案。本文将以红外…...

**Bun运行时实战:用超快启动速度重构Node.js开发体验**在现代前端与后端协同开发中,*

Bun运行时实战&#xff1a;用超快启动速度重构Node.js开发体验 在现代前端与后端协同开发中&#xff0c;启动速度、开发效率和生态兼容性成为衡量一个运行时是否优秀的核心指标。近年来&#xff0c;Bun&#xff08;https://bun.sh&#xff09;作为一款新兴的JavaScript/TypeScr…...

告别脚本和手动配置:用FlexTools一站式搞定AUTOSAR复杂驱动与中间件开发

告别脚本和手动配置&#xff1a;用FlexTools一站式搞定AUTOSAR复杂驱动与中间件开发 在汽车电子软件开发领域&#xff0c;AUTOSAR标准已经成为行业共识&#xff0c;但实际项目中&#xff0c;工程师们常常面临一个尴尬的现实&#xff1a;标准组件配置有成熟工具支持&#xff0c;…...

DDD难落地?就让AI干吧! - cleanddd-skills介绍恐

AI训练存储选型的演进路线 第一阶段&#xff1a;单机直连时代 早期的深度学习数据集较小&#xff0c;模型训练通常在单台服务器或单张GPU卡上完成。此时直接将数据存储在训练机器的本地NVMe SSD/HDD上。 其优势在于IO延迟最低&#xff0c;吞吐量极高&#xff0c;也就是“数据离…...

Rust构建系统实战

Rust构建系统实战后端转 Rust 的萌新&#xff0c;ID "第一程序员"——名字大&#xff0c;人很菜&#xff08;暂时&#xff09;。正在跟所有权和生命周期死磕&#xff0c;日常记录 Rust 学习路上的踩坑经验和"啊哈时刻"&#xff0c;代码片段保证能跑。保持学…...

UniApp分包避坑指南:pages.json配置常见错误与各平台大小限制详解

UniApp分包实战手册&#xff1a;从配置陷阱到多平台适配策略 第一次在UniApp项目里尝试分包时&#xff0c;我盯着微信开发者工具里那个刺眼的"主包超限"警告整整十分钟。这就像玩俄罗斯方块——明明每个模块都精心设计&#xff0c;却在最后关头因为几KB的差距功亏一篑…...

深夜告警炸裂?这份Linux故障排查“作战地图”请收好曰

先唠两句&#xff1a;参数就像餐厅点单 把API想象成一家餐厅的“后厨系统”。 ? 路径参数/dishes/{dish_id} -> 好比你要点“宫保鸡丁”这道具体的菜&#xff0c;它是菜单&#xff08;资源路径&#xff09;的一部分。查询参数/dishes?spicytrue&typeSichuan -> 好比…...

终极指南:如何使用BOTW存档编辑器定制你的海拉鲁冒险

终极指南&#xff1a;如何使用BOTW存档编辑器定制你的海拉鲁冒险 【免费下载链接】BOTW-Save-Editor-GUI A Work in Progress Save Editor for BOTW 项目地址: https://gitcode.com/gh_mirrors/bo/BOTW-Save-Editor-GUI 你是否曾在《塞尔达传说&#xff1a;旷野之息》的…...

2026奇点大会闭门报告泄露(含原始benchmark数据):多轮对话SOTA模型在长记忆场景下的5项隐性衰减指标

第一章&#xff1a;2026奇点智能技术大会&#xff1a;大模型多轮对话 2026奇点智能技术大会(https://ml-summit.org) 在2026奇点智能技术大会上&#xff0c;大模型多轮对话能力成为核心议题之一。与会研究者展示了新一代对话系统在长程上下文建模、意图漂移检测与跨轮记忆对齐…...