当前位置: 首页 > 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(…...

【人工智能】神经网络的优化器optimizer(二):Adagrad自适应学习率优化器

一.自适应梯度算法Adagrad概述 Adagrad&#xff08;Adaptive Gradient Algorithm&#xff09;是一种自适应学习率的优化算法&#xff0c;由Duchi等人在2011年提出。其核心思想是针对不同参数自动调整学习率&#xff0c;适合处理稀疏数据和不同参数梯度差异较大的场景。Adagrad通…...

《Qt C++ 与 OpenCV:解锁视频播放程序设计的奥秘》

引言:探索视频播放程序设计之旅 在当今数字化时代,多媒体应用已渗透到我们生活的方方面面,从日常的视频娱乐到专业的视频监控、视频会议系统,视频播放程序作为多媒体应用的核心组成部分,扮演着至关重要的角色。无论是在个人电脑、移动设备还是智能电视等平台上,用户都期望…...

STM32+rt-thread判断是否联网

一、根据NETDEV_FLAG_INTERNET_UP位判断 static bool is_conncected(void) {struct netdev *dev RT_NULL;dev netdev_get_first_by_flags(NETDEV_FLAG_INTERNET_UP);if (dev RT_NULL){printf("wait netdev internet up...");return false;}else{printf("loc…...

2024年赣州旅游投资集团社会招聘笔试真

2024年赣州旅游投资集团社会招聘笔试真 题 ( 满 分 1 0 0 分 时 间 1 2 0 分 钟 ) 一、单选题(每题只有一个正确答案,答错、不答或多答均不得分) 1.纪要的特点不包括()。 A.概括重点 B.指导传达 C. 客观纪实 D.有言必录 【答案】: D 2.1864年,()预言了电磁波的存在,并指出…...

华为OD机试-食堂供餐-二分法

import java.util.Arrays; import java.util.Scanner;public class DemoTest3 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseint a in.nextIn…...

CocosCreator 之 JavaScript/TypeScript和Java的相互交互

引擎版本&#xff1a; 3.8.1 语言&#xff1a; JavaScript/TypeScript、C、Java 环境&#xff1a;Window 参考&#xff1a;Java原生反射机制 您好&#xff0c;我是鹤九日&#xff01; 回顾 在上篇文章中&#xff1a;CocosCreator Android项目接入UnityAds 广告SDK。 我们简单讲…...

TRS收益互换:跨境资本流动的金融创新工具与系统化解决方案

一、TRS收益互换的本质与业务逻辑 &#xff08;一&#xff09;概念解析 TRS&#xff08;Total Return Swap&#xff09;收益互换是一种金融衍生工具&#xff0c;指交易双方约定在未来一定期限内&#xff0c;基于特定资产或指数的表现进行现金流交换的协议。其核心特征包括&am…...

学习STC51单片机32(芯片为STC89C52RCRC)OLED显示屏2

每日一言 今天的每一份坚持&#xff0c;都是在为未来积攒底气。 案例&#xff1a;OLED显示一个A 这边观察到一个点&#xff0c;怎么雪花了就是都是乱七八糟的占满了屏幕。。 解释 &#xff1a; 如果代码里信号切换太快&#xff08;比如 SDA 刚变&#xff0c;SCL 立刻变&#…...

如何在网页里填写 PDF 表格?

有时候&#xff0c;你可能希望用户能在你的网站上填写 PDF 表单。然而&#xff0c;这件事并不简单&#xff0c;因为 PDF 并不是一种原生的网页格式。虽然浏览器可以显示 PDF 文件&#xff0c;但原生并不支持编辑或填写它们。更糟的是&#xff0c;如果你想收集表单数据&#xff…...

蓝桥杯 冶炼金属

原题目链接 &#x1f527; 冶炼金属转换率推测题解 &#x1f4dc; 原题描述 小蓝有一个神奇的炉子用于将普通金属 O O O 冶炼成为一种特殊金属 X X X。这个炉子有一个属性叫转换率 V V V&#xff0c;是一个正整数&#xff0c;表示每 V V V 个普通金属 O O O 可以冶炼出 …...