跟我学C++中级篇——C++中的remove函数

C++中remove函数详解

一、删除函数

在前面的容器相关分析中,对std::remove及其相关的技术进行过对比分析。其实在删除函数在C/C++中有很多情况下应用,关键是名字还一样,这就可能导致很多初级的开发者感到困惑,甚至有可能产生一些错误的用法。所以,本文就是以删除文件为切入点进行分析说明它们之间的不同。

二、不同的remove函数作用

不同的库中remove函数功能有所不同,下面就分别展开分析:

  1. std::remove
    std::remove有两种情况,一种是在标准的库中的算法库中,用于删除容器相关的内容,应用它需要包含头文件。但比较让开发者容易混淆的是,在C的标准库中,也有一个相同名称的函数,它是可以用来删除指定文件的。这个一定要弄清楚,特别是相关的头文件要区别清楚。在实际应用的时候,要掌握好二者的应用场景。同时,尽量不要使用using namespae std,防止出现歧义。
  2. std::filesystem中的remove
    它主要用来删除指定的文件和空的目录。注意,只能是空的目录。如果想删除文件夹,需要使用remove_all这个函数

三、例程

根据上面的分析,再看下面的代码就容易理解了。

#include <algorithm>
#include <cstdlib>
#include <filesystem>
#include <iostream>
#include <vector>
using namespace std;
namespace fs = std::filesystem;
bool testRemoveVec() {
  std::vector<std::string> vec = {"temp1.iso", "temp2.iso", "temp3.iso"};

  const auto it = std::remove(vec.begin(), vec.end(), "temp1.iso");
  std::cerr << "deleting file: "
            << "temp1.iso" << std::endl;

  return true;
}
bool removeUseStdRemove(const std::string &filename) {
  if (std::remove(filename.c_str()) != 0) {
    std::cerr << "Error deleting file: " << filename << std::endl;
  } else {
    std::cerr << "Temporary  file deleted: " << filename << std::endl;
  }

  return true;
}
bool removeUseFileSystem(const std::string &filename) {
  std::error_code ec;
  if (fs::remove(filename, ec)) {
    std::cerr << "removeUseFileSystem deleting file OK: " << filename << ",err code:" << ec.message() << std::endl;
  } else {
    std::cerr << "removeUseFileSystem deleting file ERR: " << filename << ",err code:" << ec.message() << std::endl;
  }

  return true;
}
bool removeDirectory(const string &path) {
  try {
    if (filesystem::exists(path) && filesystem::is_directory(path)) {
      filesystem::remove_all(path);
      std::cerr << "remove path ok:" << path << std::endl;
      return true;
    } else {
      cerr << "Error: Directory does not exist." << endl;
      return false;
    }
  } catch (const filesystem::filesystem_error &e) {
    cerr << "Filesystem error: " << e.what() << endl;
    return false;
  } catch (const exception &e) {
    cerr << "General error: " << e.what() << endl;
    return false;
  }
}
int main() {
  bool bRet = removeDirectory("/home/test/project/removeTest/test");
  bRet = removeUseFileSystem("/home/test/project/removeTest/build/data.raw");
  bRet = removeUseStdRemove("/home/test/project/removeTest/build/data0.raw");
  testRemoveVec();
  return 0;
}

特别要注意代码中std::remove的具体应用所表现出来的不同。

四、总结

C和C++的编程往往混合在一起,这样,出现一些名称上的冲突是不可避免的。做为一个开发者,最重要的是明白这些冲突的来龙去脉。这些应用本身并没有什么难度,但如果不明白其中的细节,就会在应用中产生一些误用。当然,也有可能误打误撞应用成功的,却无法解释其中的原理,形成错误的认知,从而影响在以后的开发。

评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值