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++对文件读写的封装的更多相关文章

  1. php文件操作(最后进行文件常用函数封装)

    文件信息相关API $filename="./1-file.php"; //filetype($filename):获取文件的类型,返回的是文件的类型 echo '文件类型为:', ...

  2. JS封装插件:实现文件读写功能

    scripting.FileSystemObject是一个可以实现文件读写的COM组件,由于COM组件可以被跨语言调用,因此可以选择像vbs或者JS这种脚本语言调用,下面我就使用该COM组件封装了一个 ...

  3. java 对txt文件读写(已经封装好)

    读文件: public static String readTxt(String txtPath) { File file = new File(txtPath); if(file.isFile() ...

  4. .net学习笔记--文件读写的几种方式

    在.net中有很多有用的类库来读写硬盘上的文件 一般比较常用的有: File:1.什么时候使用:当读写件大小不大,同时可以一次性进行读写操作的时候使用         2.不同的方式可以读写文件类型不 ...

  5. Python之文件读写

    本节内容: I/O操作概述 文件读写实现原理与操作步骤 文件打开模式 Python文件操作步骤示例 Python文件读取相关方法 文件读写与字符编码 一.I/O操作概述 I/O在计算机中是指Input ...

  6. Linux文件读写机制及优化方式

    导读 Linux是一个可控性强的,安全高效的操作系统.本文只讨论Linux下文件的读写机制,不涉及不同读取方式如read,fread,cin等的对比,这些读取方式本质上都是调用系统api read,只 ...

  7. iOS数据持久化文件读写之偏好设置

    很多iOS应用都支持偏好设置,比如保存用户名.密码.字体大小等设置,iOS提供了一套标准的解决方案来为应用加入偏好设置功能.每个应用都有个NSUserDefaults实例,通过它来存取偏好设置.比如, ...

  8. (转)linux文件读写的流程

    转自http://hi.baidu.com/_kouu/item/4e9db87580328244ef1e53d0 在<linux内核虚拟文件系统浅析>这篇文章中,我们看到文件是如何被打开 ...

  9. Linux高级编程--05.文件读写

    缓冲I/O和非缓冲I/O 文件读写主要牵涉到了如下五个操作:打开.关闭.读.写.定位.在Linux系统中,提供了两套API, 一套是C标准API:fopen.fclose.fread.fwrite.f ...

随机推荐

  1. 9 Essential Free Linux Transcoders(转码)

    需要转码的理由千万种,所幸除了硬件转码之外,Linux平台还有很多开源工具可以借鉴,如该文章所示: 原文来自:9 Essential Free Linux Transcoders(http://www ...

  2. 使用Amoeba for mysql实现mysql读写分离(测试可行)

    Amoeba for MySQL致力于MySQL的分布式数据库前端代理层,它主要在应用层访问MySQL的时候充当query 路由功能,专注 分布式数据库 proxy 开发.座落与Client.DB S ...

  3. roboframework-ride运行案例时报 Error 267 错误问题

    偶然间碰到这个问题,检查下路径是否有中文,如有中文换成英文试试. (ps:通常自己创建的中文路径也是可以的,我的案例是从Linux环境中创建拷贝过来的,可能导致案例路径编码问题)

  4. pat1005. Spell It Right (20)

    1005. Spell It Right (20) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue Given ...

  5. nyoj 12——喷水装置二——————【贪心-区间覆盖】

    喷水装置(二) 时间限制:3000 ms  |  内存限制:65535 KB 难度:4   描述 有一块草坪,横向长w,纵向长为h,在它的橫向中心线上不同位置处装有n(n<=10000)个点状的 ...

  6. MySQL之基本语句

    SQL是Structure Query language(结构化查询语言)的缩写,它是使用关系模型的数据库应用语言.在众多开源数据库中,MySQL正是其中最杰出的代表,MySQL是由三个瑞典人于20世 ...

  7. goto语句和标签

    goto 语句用于将执行流更改到标签处,虽然t-sql和pl/sql都提供了该语句,但是作为编程而言,我们不推荐使用此编程技术.要编写一个标签,应当在标识符后面加一个冒号.列如,下面示例使用goto语 ...

  8. Spring-boot2.0.1.BUILD-SNAPSHOT整合Elasticsearch报failed to load elasticsearch nodes错误解决办法

    spring-boot整合es的application.properties的默认配置为: spring.data.elasticsearch.cluster-nodes=localhost:9200 ...

  9. synchronized修饰普通方法和静态方法

    首先,要知道,synchronized关键字修饰普通方法时,获得的锁是对象锁,也就是this.而修饰静态方法时,锁是类锁,也就是类名.class. synchronized修饰普通方法 Synchro ...

  10. 关于Activity

    Activity与界面 1.Activity相当于浏览器的标签.相当于空白的网页,界面相当于浏览器内的网页. 2.将Activity与界面绑定就相当于在浏览器内填写了相应的网页. 3.Activity ...