关于c++对文件读写的封装
namespace
{
UINT_T GetWriteSizeForNoBuf(UINT_T fsize)
{
UINT_T write_buf_size = ;
if (fsize % == )
{
write_buf_size = fsize;
}
else
{
write_buf_size = (fsize / + )* ;
}
return write_buf_size;
} } //将文件解析成路径,名称,类型
bool CFileBak::ParseFilePath(const string& file_path_name, string& file_path, string& file_name, string& file_type)
{
size_t path_pos = file_path_name.find_last_of("/\\"); // 考虑/,\两种表示路径的方法
if (path_pos == string::npos)
{
assert();
return false;
}
file_path = file_path_name.substr(, path_pos);
file_name = file_path_name.substr(path_pos + );
size_t type_pos = file_name.find_last_of(".");
if (type_pos != string::npos)
{
file_type = file_name.substr(type_pos + );
file_name = file_name.substr(, type_pos);
}
return true;
} bool CFileBak::ReadFile(std::string& buf, const std::string& file_path_name, const std::string& bak_name_tmp)
{
bool need_bak = true;
FILE* ptr_file = NULL;
size_t fsize = ;
string bak_name = bak_name_tmp;
bool tmp_false = false;
do
{
fopen_s(&ptr_file, file_path_name.c_str(), "rb");
if (NULL == ptr_file)
{
break;
} //get file size
fseek(ptr_file, , SEEK_END);
fsize = (ftell(ptr_file));
fseek(ptr_file, , SEEK_SET);
if (fsize == )
{
fclose(ptr_file);
ptr_file = NULL;
break;
}
need_bak = false;
} while (tmp_false); if (need_bak)
{
//assert(0); // 已经属于异常范畴了
if (bak_name.empty())
{
string file_path;
string file_name;
string file_type;
if (!ParseFilePath(file_path_name, file_path, file_name, file_type))
{
assert();
return false;
}
bak_name = file_path + "/" + file_name + ".data";
} fopen_s(&ptr_file, bak_name.c_str(), "rb");
if (NULL == ptr_file)
{
//assert(0);
return false;
} //get file size
fseek(ptr_file, , SEEK_END);
fsize = (ftell(ptr_file));
fseek(ptr_file, , SEEK_SET);
}
if (nullptr == ptr_file)
{
assert();
return false;
} if ( == fsize)
{
assert();
fclose(ptr_file);
return false;
} auto_ptr<char> pBuf(new char[fsize]);
memset(pBuf.get(), , fsize);
size_t read_size = fread(pBuf.get(), , fsize, ptr_file);
fclose(ptr_file);
buf.assign(pBuf.get(), read_size);
//buf = string(pBuf.get(), read_size); size_t n_pos = buf.find_last_not_of('\n');
if (string::npos != n_pos)
{
buf = buf.substr(, n_pos + );
}
return true;
} bool CFileBak::WriteFile(const std::string& file_name, const std::string& buf)
{
HANDLE hfile = CreateFileA(file_name.c_str(), GENERIC_WRITE | GENERIC_READ, , , OPEN_ALWAYS, FILE_FLAG_NO_BUFFERING, );
if (INVALID_HANDLE_VALUE == hfile)
{
assert();
CloseHandle(hfile);
return false;
} LARGE_INTEGER large_file_size;
if (!GetFileSizeEx(hfile, &large_file_size))
{
assert();
CloseHandle(hfile);
return false;
}
size_t n_pos = buf.find_last_not_of('\n'); string write_buf;
if (string::npos != n_pos)
{
write_buf = buf.substr(, n_pos + );
}
else
{
write_buf = buf;
}
UINT_T write_size = GetWriteSizeForNoBuf(max(large_file_size.LowPart, static_cast<UINT_T>(write_buf.length())));
if (write_size == )
{
assert();
CloseHandle(hfile);
return false;
} auto_ptr<char> ptr_write_buf(new char[write_size]);
memset(ptr_write_buf.get(), '\n', write_size); // 将换行写在文件中不影响使用,写0都会影响xml的功能
memcpy(ptr_write_buf.get(), write_buf.c_str(), write_buf.length()); DWORD dwret = ;
::WriteFile(hfile, ptr_write_buf.get(), write_size, &dwret, NULL);
CloseHandle(hfile);
return true;
}
关于c++对文件读写的封装的更多相关文章
- php文件操作(最后进行文件常用函数封装)
文件信息相关API $filename="./1-file.php"; //filetype($filename):获取文件的类型,返回的是文件的类型 echo '文件类型为:', ...
- JS封装插件:实现文件读写功能
scripting.FileSystemObject是一个可以实现文件读写的COM组件,由于COM组件可以被跨语言调用,因此可以选择像vbs或者JS这种脚本语言调用,下面我就使用该COM组件封装了一个 ...
- java 对txt文件读写(已经封装好)
读文件: public static String readTxt(String txtPath) { File file = new File(txtPath); if(file.isFile() ...
- .net学习笔记--文件读写的几种方式
在.net中有很多有用的类库来读写硬盘上的文件 一般比较常用的有: File:1.什么时候使用:当读写件大小不大,同时可以一次性进行读写操作的时候使用 2.不同的方式可以读写文件类型不 ...
- Python之文件读写
本节内容: I/O操作概述 文件读写实现原理与操作步骤 文件打开模式 Python文件操作步骤示例 Python文件读取相关方法 文件读写与字符编码 一.I/O操作概述 I/O在计算机中是指Input ...
- Linux文件读写机制及优化方式
导读 Linux是一个可控性强的,安全高效的操作系统.本文只讨论Linux下文件的读写机制,不涉及不同读取方式如read,fread,cin等的对比,这些读取方式本质上都是调用系统api read,只 ...
- iOS数据持久化文件读写之偏好设置
很多iOS应用都支持偏好设置,比如保存用户名.密码.字体大小等设置,iOS提供了一套标准的解决方案来为应用加入偏好设置功能.每个应用都有个NSUserDefaults实例,通过它来存取偏好设置.比如, ...
- (转)linux文件读写的流程
转自http://hi.baidu.com/_kouu/item/4e9db87580328244ef1e53d0 在<linux内核虚拟文件系统浅析>这篇文章中,我们看到文件是如何被打开 ...
- Linux高级编程--05.文件读写
缓冲I/O和非缓冲I/O 文件读写主要牵涉到了如下五个操作:打开.关闭.读.写.定位.在Linux系统中,提供了两套API, 一套是C标准API:fopen.fclose.fread.fwrite.f ...
随机推荐
- js简介 基本操作 以及循环语句 内置对象 函数044
js 全称 javascript 从交互的角度 描述行为 一 .js注释方法: //单行注释 声明变量 var 二 .声明多个变量 : var a = '2' ,b = 4, c = tru ...
- Macbook使用Gitlab配置SSH Key
git是分布式代码管理工具,远程代码管理是基于ssh的,代码上传大搜gitlab或者github代码仓储时,需要进行ssh配置. 把本地代码上传到服务器时需要加密处理,git中公钥(id_rsa.pu ...
- MAYA 卸载工具,完美彻底清除干净maya各种残留注册表和文件
是不是遇到MAYA/CAD/3DSMAX/INVENTOR安装失败?AUTODESK系列软件着实令人头疼,MAYA/CAD/3DSMAX/INVENTOR安装失败之后不能完全卸载!!!(比如maya, ...
- 重新分析connection reset by peer, socket write error错误原因
上次写<connection reset by peer, socket write error问题排查>已经过去大半年,当时把问题"敷衍"过去了. 但是此后每隔一段时 ...
- oracle客户端中文乱码问题的解决
1 查看服务器端编码 select userenv('language') from dual; 我实际查看到的结果为: USERENV('LANGUAGE') ------------------- ...
- 024-cxf.xml配置文件模板
版本一 <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://ww ...
- mobile开发技巧(转)
1.隐藏地址栏 很多文档介绍通过调用 window.scrollTo(0, 1); 就可以隐藏地址栏,但是通过实践发现隐藏地址栏还是真够坑爹的啊,只调用这一句话一般不会起作用,我们需要 functio ...
- iis6、iis7、apache设置mime类型
1.IIS6添加方法. 打开iis,展开网站,右键要设置的站点--属性.找到“http头”选项卡--mime类型 进行设置添加. 截图以.ipa mime类型举例. 2.IIS7(iis7.5.iis ...
- C#基础知识-引用类型和值类型的区别(六)
在第一篇中我们介绍了C#中基本的15种数据类型,这15种数据类型中又分为两大类,一种是值类型,一种是引用类型.值类型有sbyte.short.long.int.byte.ushort.uint.ulo ...
- 4.kafka的安装部署
为了安装过程对一些参数的理解,我先在这里提一下kafka一些重点概念,topic,broker,producer,consumer,message,partition,依赖于zookeeper, ka ...