美文网首页
C++工具函数

C++工具函数

作者: this_is_for_u | 来源:发表于2019-07-17 19:43 被阅读0次

C++ 工具函数

读取二进制文件

#include<fstream>
std::vector<char> GetDataFromBinaryFile(const std::string& file_name) {
    std::ifstream in(file_name.c_str(), std::ios::binary);
    if (in.fail()) {
        return std::vector<char>();
    }
    std::vector<char> contents(std::istreambuf_iterator<char>(in), (std::istreambuf_iterator<char>()));
    in.close();
    return contents;
}

字符串split

template <typename Out>
void string_split(const std::string& s, char delim, Out result) {
    std::stringstream ss(s);
    std::string item;
    while (std::getline(ss, item, delim)) {
        *(result++) = item;
    }
}

std::vector<std::string> string_split(const std::string& s, char delim) {
    std::vector<std::string> elems;
    string_split(s, delim, std::back_inserter(elems));
    return elems;
}

删除文件

#include <dirent.h>
int DeleteVideoFile(const std::string& file_name) {
    return remove(file_name.c_str());
}

定义枚举类,并将枚举常量转成int

enum class VideoEnum { kA = 0, kB = 1 };

template <typename E>
constexpr auto toUtype(E enumerator) noexcept {
    return static_cast<std::underlying_type_t<E>>(enumerator);
}

获取当前目录剩余存储空间byte

#include <sys/statvfs.h>
long long GetAvailableSpace(const std::string& path) {
    struct statvfs stat;
    if (statvfs(path.c_str(), &stat) != 0) {
        return -1;
    }
    return stat.f_bsize * stat.f_bavail;
}

按顺序获取某一目录文件名

int FileNameFilter(const struct dirent* cur) {
    std::string str(cur->d_name);
    if (str.find("xxx") != std::string::npos) {
        return 1;
    }
    return 0;
}

std::vector<std::string> GetDirXXXSortedPath(const std::string& dir_path) {
    struct dirent** namelist;
    std::vector<std::string> ret;
    int n = scandir(dir_path.c_str(), &namelist, FileNameFilter, alphasort);
    if (n < 0) {
        return ret;
    }
    for (int i = 0; i < n; ++i) {
        std::string path = dir_path + "/" + namelist[i]->d_name;
        ret.emplace_back(path);
    }
    free(namelist);
    return ret;
}

判断文件是否存在

bool FileExists(const std::string& filename) {
    std::ifstream ifile(filename.c_str());
    return (bool)ifile;
}

打印耗时的helper

log

#define KNRM  "\x1B[0m"
#define KRED  "\x1B[31m"
#define KGRN  "\x1B[32m"
#define KYEL  "\x1B[33m"
#define KBLU  "\x1B[34m"
#define KMAG  "\x1B[35m"
#define KCYN  "\x1B[36m"
#define KWHT  "\x1B[37m"
//log添加颜色
#define LOG_RELEASE 1
#define LOG_DEBUG 3

#ifdef DEBUG
#define LOG_LEVEL 4 // DEBUG
#else
#define LOG_LEVEL 2 //RELEASE
#endif


int log(int priority, const char *format, ...) {
  if (priority > LOG_LEVEL) {
    return 1;
  }
  printf("%s", KBLU);
  va_list args;
  va_start(args, format);
  vprintf(format, args);
  va_end(args);
  printf("%s", KNRM);
  return 0;
}

timer

#include <iostream>
#include <chrono>
#include <string>
#include <ctime>
#include <sys/time.h>
#include <fstream>

using namespace std::chrono;
using llong = long long;

class TimerLog {
public:
  TimerLog(const std::string tag) {
    m_begin = high_resolution_clock::now();
    m_tag = tag;
  }

  void reset() {
    m_begin = high_resolution_clock::now();
  }

  llong elapsed() {
    return (llong) duration_cast<std::chrono::milliseconds>(high_resolution_clock::now() - m_begin).count();
  }

  static time_point<high_resolution_clock> now() {
    return high_resolution_clock::now();
  }

  static llong diffUs(time_point<high_resolution_clock> before, time_point<high_resolution_clock> after) {
    return (llong) duration_cast<std::chrono::microseconds>(after - before).count();
  }

  static llong diffMs(time_point<high_resolution_clock> before, time_point<high_resolution_clock> after) {
    return (llong) duration_cast<std::chrono::milliseconds>(after - before).count();
  }

  TimerLog() {
    auto time = duration_cast<std::chrono::milliseconds>(high_resolution_clock::now() - m_begin).count();
    log(LOG_DEBUG, "time { %s } %f ms\n", m_tag.c_str(), (double)time);
  }

  static llong getCurrentMs() {
    std::chrono::milliseconds ms =
        std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::system_clock::now().time_since_epoch());
    return static_cast<llong>(ms.count());
  }

  static void showCurTime() {
    time_t now = time(0);
    char* dt = ctime(&now);
    log(LOG_DEBUG, "cur time is %s\n", dt);
    log(LOG_DEBUG, "cur ms %lld\n", getCurrentMs());
  }

  static struct timeval getCurrentTimeofDay() {
    struct timeval time;
    gettimeofday(&time, NULL);
    return time;
  }

private:
  time_point<high_resolution_clock> m_begin;
  std::string m_tag;
};

相关文章

  • C++工具函数

    C++ 工具函数 读取二进制文件 字符串split 删除文件 定义枚举类,并将枚举常量转成int 获取当前目录剩余...

  • windows逆向3

    VC 程序内存和编译的一些特征C++ 构造函数C++ 成员函数C++ 析构函数C++ 全局对象的构造C++ 全局对...

  • C++Primer之 函数探幽

    读C++ primer总结 C++函数包括函数声明和函数定义,函数声明即函数原型,一般隐藏在include文件中。...

  • 一些函数

    cmp函数 C++ sort cmp函数 - lzz的博客 - CSDN博客 浅谈C/C++排序函数中cmp()比...

  • iOS-底层(11):dyld加载流程

    +load方法、c++函数、main函数的调用顺序 从打印顺序我们可以看到:** +load方法 -> c++函数...

  • C/C++ 函数地址

    C 函数 C 语言中没有类的概念,只有普通的函数。 控制台输出: C++ 函数 C++ 函数有如下几种: 1)普通...

  • C/C++ 取整函数ceil(),floor()2019-10-

    转自: C/C++ 取整函数ceil(),floor() C/C++ 取整函数ceil(),floor() #in...

  • 宏定义min

    C++内联函数

  • C++ 模版 学习总结

    C++ 模版 模板是C++支持参数化多态的工具,使用模板可以使用户为类或者函数声明一种一般模式,使得类中的某些数据...

  • 浅析c++三大函数--GeekBand

    浅析c++ 三大函数 三大函数的特殊性 c++三大函数指的是拷贝构造、拷贝赋值、析构函数。这3个函数比较特殊: 一...

网友评论

      本文标题:C++工具函数

      本文链接:https://www.haomeiwen.com/subject/ppgclctx.html