C++学习之路(五)C++ 实现简单的文件管理系统命令行应用 - 示例代码拆分讲解
简单的文件管理系统示例介绍:
这个文件管理系统示例是一个简单的命令行程序,允许用户进行文件的创建、读取、追加内容和删除操作。这个示例涉及了一些基本的文件操作和用户交互。
功能概述:
-
创建文件 (
createFile()
):- 用户可以输入文件名和内容,创建新的文件。
-
读取文件 (
readFile()
):- 用户可以输入文件名,读取并显示文件的内容。
-
追加文件内容 (
appendToFile()
):- 用户可以输入文件名和内容,将新内容追加到已存在的文件末尾。
-
删除文件 (
deleteFile()
):- 用户可以输入文件名,删除指定的文件。
涉及的知识点:
-
文件输入输出 (
<fstream>
):- 使用
std::ifstream
和std::ofstream
实现文件读取和写入功能。
- 使用
-
文件流的打开和关闭:
is_open()
和close()
函数用于检查文件流是否打开以及关闭文件。
-
命令行交互:
- 使用
std::cin
和std::cout
实现与用户的交互。
- 使用
-
文件操作函数:
std::remove()
函数用于删除文件。
-
循环和条件语句:
- 使用
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() 的特点:
-
读取整行文本: 不像
std::cin >> variable
会在遇到空格或换行符时停止读取,std::getline()
会读取整行文本。 -
可以指定定界符(可选): 可以传递第三个参数作为定界符,以指定特定的字符作为终止符号,例如
std::getline(std::cin, line, '\t')
将在遇到制表符时停止读取。 -
常用于读取用户输入: 在命令行交互中,特别适用于读取用户输入的完整一行文本,例如文件名、描述等信息。
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++ 实现简单的文件管理系统命令行应用 - 示例代码拆分讲解
简单的文件管理系统示例介绍: 这个文件管理系统示例是一个简单的命令行程序,允许用户进行文件的创建、读取、追加内容和删除操作。这个示例涉及了一些基本的文件操作和用户交互。 功能概述: 创建文件 (createFile()): 用户可以输入文件名和内…...

Node.js下载安装及配置镜像源
一、进入官网地址下载安装包 https://nodejs.org/dist 选择对应你系统的Node.js版本 这里我选择的是Windows系统、64位 二、安装程序 (1)下载完成后,双击安装包,开始安装Node.js (2)直接点【Next】按钮,此处可根据…...
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请求的操作过程
理论很简单,过程很曲折,版本适配的问题要小心。 场景: 要和前端进行联调,我本地后端用了https,证书是自制的,主要是页面里面有一些oauth2认证的地方,需要跳转。 比如https://aaa.com/profile.h…...

Linux 面试题(一)
目录 1、绝对路径用什么符号表示?当前目录、上层目录用什么表示?主目录用什么表示? 切换目录用什么命令? 2、怎么查看当前进程?怎么执行退出?怎么查看当前路径? 3、怎么清屏?怎么退出当前命…...
HIVE SQL取整函数汇总
目录 int()round(double a)round(double a,int d)floor()ceil() int() 向零取整,即向接近零的方向取整。 int(5.6)输出:5 int(-5.6)输出:-5 round(double a) 四舍五入取整 select round(5.6)输出:6 select round(-5.6)输出&…...

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

pandas 如何获取dataframe的行的数量
pandas的dataframe提供了多种方法获取其中数据的行的数量,本偏文章就是介绍几种获取dataframe行和列出量的方法。 为了能够详细说明如何通过代码获取dataframe的行数和列数,需要先创建一个dataframe如下: 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创建线程非常简单,只需要提供线程函数或者线程对象即可,并可以同时指定线程函数的参数。下面是创建线程的示例: #include <thread> #include <iostream> using namespace std;void func() {cout <<…...

Deepmind开发音频模型Lyria 用于生成高品质音乐;创建亚马逊新产品评论摘要
🦉 AI新闻 🚀 Deepmind开发音频模型Lyria 用于生成高品质音乐 摘要:Deepmind推出名为Lyria的音频模型,可生成带有乐器和人声的高品质音乐。Lyria模型针对音乐生成的挑战,解决了音乐信息密度高、音乐序列中的连续性维…...

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

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

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

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

网络安全—自学
1.网络安全是什么 网络安全可以基于攻击和防御视角来分类,我们经常听到的 “红队”、“渗透测试” 等就是研究攻击技术,而“蓝队”、“安全运营”、“安全运维”则研究防御技术。 2.网络安全市场 一、是市场需求量高; 二、则是发展相对成熟…...
首页以卡片形式来展示区块链列表数据(Web3项目一实战之五)
我们已然在 Web3 分布式存储 IPFS(Web3项目一实战之四) 介绍了什么是IPFS,以及在本地电脑如何安装它。虽然在上一篇讲解了该怎么安装IPFS,也做了相应的配置,但在本地开发阶段,前端总是无法避免跨域这个远程请求api的”家常便饭的通病“。 很显然,对于出现跨域这类常见问…...
opencv使用pyinstaller打包错误:‘can‘t find starting number (in the name of file)
使用Python语言和opencv模块在pycharm中编辑的代码运行没问题,但是在使用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项
文章目录 前言一、题目描述 二、题目分析 三、解题 程序运行代码 四、结果显示 前言 本系列为一维数组编程题,点滴成长,一起逆袭。 一、题目描述 用数组处理求Fibonacci数列前20项 二、题目分析 前两项:f[20]{1,1} 后18项:for(…...
Java 8 Stream API 入门到实践详解
一、告别 for 循环! 传统痛点: Java 8 之前,集合操作离不开冗长的 for 循环和匿名类。例如,过滤列表中的偶数: List<Integer> list Arrays.asList(1, 2, 3, 4, 5); List<Integer> evens new ArrayList…...

【网络安全产品大调研系列】2. 体验漏洞扫描
前言 2023 年漏洞扫描服务市场规模预计为 3.06(十亿美元)。漏洞扫描服务市场行业预计将从 2024 年的 3.48(十亿美元)增长到 2032 年的 9.54(十亿美元)。预测期内漏洞扫描服务市场 CAGR(增长率&…...

屋顶变身“发电站” ,中天合创屋面分布式光伏发电项目顺利并网!
5月28日,中天合创屋面分布式光伏发电项目顺利并网发电,该项目位于内蒙古自治区鄂尔多斯市乌审旗,项目利用中天合创聚乙烯、聚丙烯仓库屋面作为场地建设光伏电站,总装机容量为9.96MWp。 项目投运后,每年可节约标煤3670…...

第一篇:Agent2Agent (A2A) 协议——协作式人工智能的黎明
AI 领域的快速发展正在催生一个新时代,智能代理(agents)不再是孤立的个体,而是能够像一个数字团队一样协作。然而,当前 AI 生态系统的碎片化阻碍了这一愿景的实现,导致了“AI 巴别塔问题”——不同代理之间…...

Cloudflare 从 Nginx 到 Pingora:性能、效率与安全的全面升级
在互联网的快速发展中,高性能、高效率和高安全性的网络服务成为了各大互联网基础设施提供商的核心追求。Cloudflare 作为全球领先的互联网安全和基础设施公司,近期做出了一个重大技术决策:弃用长期使用的 Nginx,转而采用其内部开发…...
Angular微前端架构:Module Federation + ngx-build-plus (Webpack)
以下是一个完整的 Angular 微前端示例,其中使用的是 Module Federation 和 npx-build-plus 实现了主应用(Shell)与子应用(Remote)的集成。 🛠️ 项目结构 angular-mf/ ├── shell-app/ # 主应用&…...

回溯算法学习
一、电话号码的字母组合 import java.util.ArrayList; import java.util.List;import javax.management.loading.PrivateClassLoader;public class letterCombinations {private static final String[] KEYPAD {"", //0"", //1"abc", //2"…...

tauri项目,如何在rust端读取电脑环境变量
如果想在前端通过调用来获取环境变量的值,可以通过标准的依赖: std::env::var(name).ok() 想在前端通过调用来获取,可以写一个command函数: #[tauri::command] pub fn get_env_var(name: String) -> Result<String, Stri…...
多元隐函数 偏导公式
我们来推导隐函数 z z ( x , y ) z z(x, y) zz(x,y) 的偏导公式,给定一个隐函数关系: F ( x , y , z ( x , y ) ) 0 F(x, y, z(x, y)) 0 F(x,y,z(x,y))0 🧠 目标: 求 ∂ z ∂ x \frac{\partial z}{\partial x} ∂x∂z、 …...

leetcode73-矩阵置零
leetcode 73 思路 记录 0 元素的位置:遍历整个矩阵,找出所有值为 0 的元素,并将它们的坐标记录在数组zeroPosition中置零操作:遍历记录的所有 0 元素位置,将每个位置对应的行和列的所有元素置为 0 具体步骤 初始化…...