使用 C++ 实现文件复制与删除

news2024/11/4 18:37:06

在日常的编程实践中,文件操作是不可避免的,无论是读取、写入还是复制文件。C++ 提供了丰富的文件处理库,使得这些操作变得相对简单。在本文中,我们将深入分析一个简单的 C++ 程序,该程序实现了文件的复制和删除功能。我们将从代码解析、功能实现、错误处理以及代码优化等方面进行详细讲解。

代码解析

下面是我们要分析的 C++ 代码:

#include <iostream>
#include <cstring>
#include <fstream>
#include <cstdlib>
#include <sys/stat.h>
#include <unistd.h>

using namespace std;

int main(int argc, char const *argv[])
{
    if(argc != 3)
    {
        cout << "Usage: " << argv[0] << " src_file  dest_file" << endl;
        return -1;
    }
    
    ifstream ifs(argv[1]);
    if(!ifs.good()) 
    {
        cout << "文件不存在,请重试 " << argv[1] << endl;
        return -1;
    }    
    
    if(0 == access(argv[2], 0))
    {
        cout << "目标文件已存在,是否覆盖(y/n) "  << endl;
        char ch;
        cin >> ch;
        if(ch != 'y' && ch != 'Y')
        {
            cout << "操作取消 " << endl;
            ifs.close();
            return 0;
        }
    }

    ofstream ofs(argv[2]);
    if(!ofs.good())
    {
        cout << "目标文件无权限或打开失败 " << endl;
        return -1;
    }
    
    char buf[1024];
    do
    {
        ifs.read(buf, sizeof(buf));
        ofs.write(buf, ifs.gcount());
    } while(!ifs.eof());
    
    ifs.close();
    ofs.close();
    remove(argv[1]);
    
    return 0;
}

1. 引入头文件

我们引入了一系列头文件:

  • #include <iostream>:用于标准输入输出。
  • #include <cstring>:用于字符串处理。
  • #include <fstream>:用于文件输入输出。
  • #include <cstdlib>:用于通用工具函数。
  • #include <sys/stat.h>#include <unistd.h>:用于文件状态检查。

2. 主函数入口

程序从 main 函数开始,首先检查命令行参数的数量。若数量不为 3,则输出用法提示并返回。

if(argc != 3)
{
    cout << "Usage: " << argv[0] << " src_file  dest_file" << endl;
    return -1;
}

3. 文件存在性检查

使用 ifstream 打开源文件并检查其是否存在。若文件不存在,程序会提示用户并退出。

ifstream ifs(argv[1]);
if(!ifs.good()) 
{
    cout << "文件不存在,请重试 " << argv[1] << endl;
    return -1;
}

4. 检查目标文件

在复制之前,我们需要确认目标文件是否已经存在。如果存在,则询问用户是否要覆盖。

if(0 == access(argv[2], 0))
{
    cout << "目标文件已存在,是否覆盖(y/n) "  << endl;
    char ch;
    cin >> ch;
    if(ch != 'y' && ch != 'Y')
    {
        cout << "操作取消 " << endl;
        ifs.close();
        return 0;
    }
}

5. 创建目标文件

接下来,我们使用 ofstream 创建目标文件并检查其是否成功打开。

ofstream ofs(argv[2]);
if(!ofs.good())
{
    cout << "目标文件无权限或打开失败 " << endl;
    return -1;
}

6. 文件复制

通过一个 do-while 循环,我们逐块读取源文件的内容并写入到目标文件。ifs.gcount() 返回上一次读取的字节数,确保不会写入多余的字节。

char buf[1024];
do
{
    ifs.read(buf, sizeof(buf));
    ofs.write(buf, ifs.gcount());
} while(!ifs.eof());

7. 关闭文件和删除源文件

最后,关闭源文件和目标文件,并使用 remove 函数删除源文件。

ifs.close();
ofs.close();
remove(argv[1]);

错误处理

在文件操作中,错误处理非常重要。我们在每一步都进行了必要的检查,例如:

  • 检查文件是否存在。
  • 检查目标文件是否存在并处理覆盖逻辑。
  • 检查文件是否成功打开。

这样的错误处理机制可以提高程序的鲁棒性,避免在运行时出现意外崩溃。

代码优化

虽然上述代码可以实现基本的文件复制与删除功能,但仍然有一些优化空间:

  1. 使用 RAII:可以将文件流封装在类中,实现自动资源管理,避免手动调用 close()
  2. 多线程:对于大文件的复制,可以考虑使用多线程,提高效率。
  3. 异常处理:在 C++ 中,可以使用异常处理机制替代简单的错误检查,使代码更加简洁。

扩展功能

根据实际需求,我们可以扩展该程序的一些功能:

  • 支持命令行参数:增加 -r 选项以支持递归复制目录。
  • 进度显示:在复制大文件时,显示复制进度。
  • 文件比较:在复制前,比较源文件和目标文件的内容,如果相同则不进行复制。

结论

通过这段简单的 C++ 代码,我们展示了如何实现文件的复制和删除功能。虽然代码的实现比较基础,但它展示了文件操作的基本流程和错误处理的必要性。随着功能的扩展和优化,您可以将其发展为一个更加强大且灵活的文件管理工具。

希望这篇博客能够帮助你更好地理解 C++ 的文件操作及其实现过程。如果您有任何问题或建议,请随时与我交流!

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

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

相关文章

Java面试经典 150 题.P26. 删除有序数组中的重复项(003)

本题来自&#xff1a;力扣-面试经典 150 题 面试经典 150 题 - 学习计划 - 力扣&#xff08;LeetCode&#xff09;全球极客挚爱的技术成长平台https://leetcode.cn/studyplan/top-interview-150/ 题解&#xff1a; class Solution {public int removeDuplicates(int[] nums) …

Prometheus套装部署到K8S+Dashboard部署详解

1、添加helm源并更新 helm repo add prometheus-community https://prometheus-community.github.io/helm-charts helm repo update2、创建namespace kubectl create namespace monitoring 3、安装Prometheus监控套装 helm install prometheus prometheus-community/prome…

如何选择到印尼的海运代理

如何选择到印尼的海运代理 选择合适的海运代理的重要性 海运代理负责安排货物从发货地到目的地的整个运输过程&#xff0c;包括装运、清关、仓储等服务。一个可靠的海运代理能确保货物安全准时到达&#xff0c;并帮助企业节省时间和成本。 选择海运代理需考虑的主要因素 公司…

python常用的第三方库下载方法

方法一&#xff1a;打开pycharm-打开项目-点击左侧图标查看已下载的第三方库-没有下载搜索后点击install即可直接安装--安装成功后会显示在installed列表 方法二&#xff1a;打开dos窗口输入命令“pip install requests“后按回车键&#xff0c;看到successfully既安装成功&…

FFmpeg 4.3 音视频-多路H265监控录放C++开发八,使用SDLVSQT显示yuv文件 ,使用ffmpeg的AVFrame

一. AVFrame 核心回顾&#xff0c;uint8_t *data[AV_NUM_DATA_POINTERS] 和 int linesize[AV_NUM_DATA_POINTERS] AVFrame 存储的是解码后的数据&#xff0c;&#xff08;包括音频和视频&#xff09;例如&#xff1a;yuv数据&#xff0c;或者pcm数据&#xff0c;参考AVFrame结…

jenkins 构建报错 Cannot run program “sh”

原因 在 windows 操作系统 jenkins 自动化部署的时候, 由于自动化构建的命令是 shell 执行的,而默认windows 从 path 路径拿到的 shell 没有 sh.exe &#xff0c;因此报错。 解决方法 前提是已经安装过 git WINR 输入cmd 打开命令行, 然后输入where git 获取 git 的路径, …

基于Spring Boot的高校物品捐赠管理系统设计与实现,LW+源码+讲解

摘 要 传统办法管理信息首先需要花费的时间比较多&#xff0c;其次数据出错率比较高&#xff0c;而且对错误的数据进行更改也比较困难&#xff0c;最后&#xff0c;检索数据费事费力。因此&#xff0c;在计算机上安装高校物品捐赠管理系统软件来发挥其高效地信息处理的作用&a…

AndroidStudio通过Bundle进行数据传递

作者&#xff1a;CSDN-PleaSure乐事 欢迎大家阅读我的博客 希望大家喜欢 使用环境&#xff1a;AndroidStudio 目录 1.新建活动 2.修改页面布局 代码&#xff1a; 效果&#xff1a; 3.新建类ResultActivity并继承AppCompatActivity 4.新建布局文件activity_result.xml 代…

测试分层:减少对全链路回归依赖的探索!

引言&#xff1a;测试分层与全链路回归的挑战 在软件开发和测试过程中&#xff0c;全链路回归测试往往是一个复杂且耗费资源的环节&#xff0c;尤其在系统庞大且模块众多的场景下&#xff0c;全链路测试的集成难度显著提高。而“测试分层”作为一种结构化的测试方法&#xff0…

【python】OpenCV—findContours(4.5)

文章目录 1、功能描述2、原理分析3、代码实现4、效果展示5、完整代码6、参考 1、功能描述 输入图片&#xff0c;计算出图片中的目标到相机间的距离 2、原理分析 用最简单的三角形相似性 已知参数&#xff0c;物体的宽度 W W W&#xff0c;物体到相机的距离 D D D&#xff0…

jmeter基础01-3_环境准备-Linux系统安装jdk

Step1. 查看系统类型 打开终端&#xff0c;命令行输入uname -a&#xff0c;显示所有系统信息&#xff0c;包括内核名称、主机名、内核版本等。 如果输出是x86_64&#xff0c;则系统为64位。如果输出是i686 或i386&#xff0c;则系统为32位。 Step2. 官网下载安装包 https://www…

获取JSON对象的时候,值会自动带上双引号

问题&#xff1a;当使用下方代码&#xff0c;获取JsonNode对象的时候&#xff0c;从该对象中通过键获取的值会自动带上双引号。 JsonNode jsonNode new ObjectMapper().readTree("JSON字符串"); 注意&#xff1a;以上方法是获得的JsonNode对象&#xff0c;不是JSO…

大气污染监测系统方案:智慧环保监测的“千里眼“

​ 作为星创易联的一名工程师,我有幸参与了某市环保局的大气污染监测系统项目。该市地处我国中部地区,近年来工业发展迅速,大气污染问题日益突出。为加强环境管理,政府决定构建一套覆盖全市的大气污染在线监测系统,实时掌握各区域的空气质量状况。 我们公司凭借在物联网领域的…

leetcode-88-合并两个有序数组

题解&#xff1a; 解法一&#xff1a;从后向前同时遍历两个数组&#xff0c;因为nums1后面是0&#xff0c;从后遍历节省空间。 1、定义三个指针&#xff0c;分别为&#xff1a;len1m-1指向nums1的最后一个非0数字&#xff1b;len2n-1指向nums2的最后一个数字&#xff1b;len3…

百度文心智能体:巧用汉字笔画生成与汉字搜索插件,打造一个学习汉字的教育类智能体

这篇文章&#xff0c;主要介绍如何巧用汉字笔画生成与汉字搜索插件&#xff0c;打造一个学习汉字的教育类智能体。 目录 一、教育类智能体 1.1、智能体演示 1.2、智能体插件 1.3、智能体prompt &#xff08;1&#xff09;角色和目标 &#xff08;2&#xff09;思考路径 …

MySQL rand()函数、rand(n)、生成不重复随机数

文章目录 一、rand()与rand(n)二、rand()使用示例2.1、rand()与order by/group by使用随机排序分组2.2、round()与rand()的组合使用2.3、rand与ceiling的组合使用2.4、rand与floor组合使用2.5、rand与md5组合使用 三、总结3.1、rand()与rand(n)的区别 有时候我们想要生成一个唯…

『Linux学习笔记』如何在 Ubuntu 22.04 上安装和配置 VNC

『Linux学习笔记』如何在 Ubuntu 22.04 上安装和配置 VNC 文章目录 一. 『Linux学习笔记』如何在 Ubuntu 22.04 上安装和配置 VNC1. 介绍 二. 参考文献 一. 『Linux学习笔记』如何在 Ubuntu 22.04 上安装和配置 VNC 如何在 Ubuntu 22.04 上安装和配置 VNChttps://hub.docker.c…

ubuntu22-安装vscode-配置shell命令环境-mac安装

文章目录 1.安装vscode2.修改语言为中文3.配置bash调试环境3.1.安装插件3.2.添加配置文件 4.调试bash4.1.新建tmp.sh文件4.2.运行启动 5.mac安装6.mac卸载 1.安装vscode 从官网下载安装包Code_1.93.1-1726079302_amd64.deb。 在ubuntu系统中&#xff0c;安装包所在目录打开命令…

MongoDB 8.0.3版本安装教程

MongoDB 8.0.3版本安装教程 一、下载安装 1.进入官网 2.选择社区版 3.点击下载 4.下载完成后点击安装 5.同意协议&#xff0c;下一步 6.选择第二个Custon&#xff0c;自定义安装 7.选择安装路径 &#xff01;记住安装路径 8.默认&#xff0c;下一步 9.取…

编程八种语言谁是最受市场青睐的?

你听说过"编程语言江湖"吗?在这个瞬息万变的IT世界里&#xff0c;各种编程语言就像武林高手&#xff0c;各展绝技&#xff0c;争夺"武林盟主"的宝座。 1. JavaScript/TypeScript: 江湖新贵的崛起江湖中有一句老话:"十年磨一剑&#xff0c;霜刃未曾试…