C++文件处理工具类
C++文件处理工具类,hpp文件,使用时只需要include即可,跨平台
File.hpp
#ifndef FILE_HPP
#define FILE_HPP
#include <fstream>
#include <string>
#include <stdexcept>
#include <memory>
#include <sstream>
#include <unistd.h>
#include<sys/stat.h>
namespace sh
{
enum class FileMode
{
EXISTS = 0,//存在
EXECUTE = 1,//执行
WRITE = 2,//写
READ = 4//读
};
/**
* 文件操作
* @author: sherlock_lht
*/
class BaseFileIO
{
protected:
std::fstream fileStream;
std::string fileName;
explicit BaseFileIO(const std::string &fileName)
{
this->fileName = fileName;
}
public:
/**
* 检查文件是否存在
*/
static bool exists(const std::string &filePath)
{
return access(filePath.c_str(), F_OK) == 0;
}
/**
* 检查指定文件的指定属性,包括是否存在、是否可读、是否可写、是否有权限执行
*/
static bool checkFileMode(const std::string& filePath, sh::FileMode mode)
{
return access(filePath.c_str(), (int)mode) == 0;
}
/**
* 给指定文件赋予权限,同chmod指令
*/
static bool chmodFile(const std::string &filePath, int mode)
{
return chmod(filePath.c_str(), mode) == 0;
}
public:
/**
* 打开文件,返回是否成功打开
*/
bool open(std::ios_base::openmode mode)
{
if (fileStream.is_open())
{
close();
}
fileStream.open(fileName, mode);
return fileStream.is_open();
}
/**
* 设置文件的开始读取偏移
*/
void seekInputPosition(std::size_t offsetPosition, std::ios_base::seekdir position = std::ios::beg)
{
fileStream.seekg(offsetPosition, position);
}
/**
* 是否已经读到end,可用此方法判断文件是否已经读完
*/
bool endOfFile() const
{
return fileStream.eof();
}
/**
* 获取当前处理的文件名称
*/
std::string getFileName() const
{
return fileName;
}
/**
* 关闭文件流,如果从未打开,则无任何操作
*/
void close()
{
if (fileStream.is_open())
{
fileStream.close();
}
}
virtual ~BaseFileIO()
{
close();
}
};
class File: public BaseFileIO
{
public:
/**
* 向指定的文件写入指定的内容,返回值表示是否写入成功
*/
static bool saveTextTo(const std::string &fileName, const std::string &text)
{
File fileToWrite(fileName);
if (fileToWrite.open(std::ios::out | std::ios::app))
{
fileToWrite.write(text);
fileToWrite.close();
return true;
}
return false;
}
public:
explicit File(const std::string &fileName)
: BaseFileIO(fileName)
{}
/**
* 写入内容,返回值表示写入成功的长度
*/
std::size_t write(const std::string &content)
{
auto before = fileStream.tellp();
fileStream.write(content.data(), content.length());
return fileStream.tellp() - before;
}
/**
* 读取所有文件内容
* offset参数表示开始读取的偏移
* 如果在调用之前有读取过文件,则会影响该函数的开始读取位置
*/
std::string readAll(std::size_t offset = 0)
{
if (!fileStream.is_open())
{
return "";
}
if (offset > 0)
{
seekInputPosition(offset);
}
std::stringstream buf;
buf << fileStream.rdbuf();
return buf.str();
}
/**
* 读取指定数量的字符串,如果内容不够,则读完
* offset参数表示开始读取的偏移
* 读取位置置于本次最后读取的内容的结尾
*/
std::string read(std::size_t maxSize, std::size_t offset = 0)
{
if (!fileStream.is_open())
{
return "";
}
if (offset > 0)
{
seekInputPosition(offset);
}
std::unique_ptr<char[]> buf(new(std::nothrow) char[maxSize + 1]);
fileStream.read(buf.get(), maxSize);
std::size_t size = fileStream.gcount();
std::string str(buf.get(), size);
return str;
}
/**
* 从标记开始位置读取到一行结尾,包括终止符
* offset参数表示开始读取的偏移
*/
std::string readLine(std::size_t maxSize, std::size_t offset = 0)
{
if (!fileStream.is_open())
{
return "";
}
std::unique_ptr<char[]> buf(new(std::nothrow) char[maxSize + 1]);
fileStream.getline(buf.get(), maxSize);
std::size_t size = fileStream.gcount();
std::string str(buf.get(), size);
return str;
}
};
}
#endif //FILE_HPP
C++文件处理工具类的更多相关文章
- 文件类型工具类:FileTypeUtil
个人学习,仅供参考! package com.example.administrator.filemanager.utils;import java.io.File;/** * 文件类型工具类 * * ...
- iOS开发拓展篇—封装音频文件播放工具类
iOS开发拓展篇—封装音频文件播放工具类 一.简单说明 1.关于音乐播放的简单说明 (1)音乐播放用到一个叫做AVAudioPlayer的类 (2)AVAudioPlayer常用方法 加载音乐文件 - ...
- 文件夹工具类 - FolderUtils
文件夹工具类,提供创建完整路径的方法. 源码如下:(点击下载 -FolderUtils.java .commons-io-2.4.jar ) import java.io.File; import o ...
- java文件处理工具类
import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.BufferedRead ...
- 写文件的工具类,输出有格式的文件(txt、json/csv)
import java.io.BufferedWriter; import java.io.File; import java.io.FileOutputStream; import java.io. ...
- properties文件读写工具类
java代码: import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; ...
- Java-Properties文件读取工具类
import org.apache.commons.configuration.ConfigurationException; import org.apache.commons.configurat ...
- Java 文件切割工具类
Story: 发送MongoDB 管理软件到公司邮箱,工作使用. 1.由于公司邮箱限制附件大小,大文件无法发送,故做此程序用于切割大文件成多个小文件,然后逐个发送. 2.收到小文件之后,再重新组合成原 ...
- Java 压缩文件夹工具类(包含解压)
依赖jar <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons ...
- ZIP解压缩文件的工具类【支持多级文件夹|全】
ZIP解压缩文件的工具类[支持多级文件夹|全] 作者:Vashon 网上有非常多的加压缩演示样例代码.可是都仅仅是支持一级文件夹的操作.假设存在多级文件夹的话就不行了. 本解压缩工具类经过多次检查及重 ...
随机推荐
- 【Boost】Windows 下个人在配置 Boost 踩到的坑以及解决方案
要编译的 Boost 版本:1.82.0 假设 Boost 的根目录为 ${boost_root}$ 如果不想编译可以使用博主编译后的Boost:https://pan.baidu.com/s/1s2 ...
- HUD 5773 LIS(最长上升序列)
***关于lower_bound()的用法参见:http://blog.csdn.net/niushuai666/article/details/6734403 lower_bound用法:函数low ...
- sql语句内变量的使用
0.原始表格如下: 1.定义变量,并在sql语句内查询: set @user_name = "成龙";SELECT * FROM `tb_user` where userName ...
- shell脚本(4)-格式化输入
一.read命令 1.概念: 默认接受键盘的输入,回车符代表输入结束 2.read命令选项 -p:打印信息 -t:限定时间 -s:不回显 -n:输入字符个数 3.举例说明 (1)模拟登录 [root@ ...
- java进阶(16)--System常用方法总结
一.Systen.out静态变量 静态变量,用的最多的是调用print方法 二.System.out.println() println()其实是printStream类的方法 三.Sytem ...
- 机器学习-线性分类-支持向量机SVM-SMO算法代码实现-15
1. alpha2 的修剪 if y1 != y2 : α1 - α2 = k # 不用算k的具体大小 if k > 0: # 上图的左 下这条线 α2 的区间 (0, c-k) k < ...
- 到底什么样的 Java 项目用 Solon 好???
什么样的 Java 项目用 Solon 好 就像华为讲的,不要因为爱国而特意买华为手机.Solon 也是,有需要就用不需要就跳过(按正常的需求选择): 信创需要国产化,应该用 Solon 或者 Sol ...
- P5733 【深基6.例1】自动修正
1.题目介绍 2. 题解 2.1 字符串大小写转换 思路 str[i] -= 'a' -'A'; 注意这里转换方式,即减去偏移量(ASCII码表中,'a'在'A'前面,如果记不得偏移量,就直接写'a' ...
- [java] - 数据库连接工具类
package util; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLExceptio ...
- css - 伪元素清除浮动
.clearfix:after{ content:""; /*设置内容为空*/ height:0; /*高度为0*/ line-height:0; /*行高为0*/ display ...