关于c++对文件读写的封装

  1 namespace 
  2 {
  3     UINT_T GetWriteSizeForNoBuf(UINT_T fsize)
  4     {
  5         UINT_T write_buf_size = 0;
  6         if (fsize % 512 == 0)
  7         {
  8             write_buf_size = fsize;
  9         }
 10         else
 11         {
 12             write_buf_size = (fsize / 512 + 1)* 512;
 13         }
 14         return write_buf_size;
 15     }
 16     
 17 }
 18 
 19 //将文件解析成路径,名称,类型
 20 bool CFileBak::ParseFilePath(const string& file_path_name, string& file_path, string& file_name, string& file_type)
 21 {
 22     size_t path_pos = file_path_name.find_last_of("/\\"); // 考虑/,\两种表示路径的方法
 23     if (path_pos == string::npos)
 24     {
 25         assert(0);
 26         return false;
 27     }
 28     file_path = file_path_name.substr(0, path_pos);
 29     file_name = file_path_name.substr(path_pos + 1);
 30     size_t type_pos = file_name.find_last_of(".");
 31     if (type_pos != string::npos)
 32     {
 33         file_type = file_name.substr(type_pos + 1);
 34         file_name = file_name.substr(0, type_pos);
 35     }
 36     return true;
 37 }
 38 
 39 bool CFileBak::ReadFile(std::string& buf, const std::string& file_path_name, const std::string& bak_name_tmp)
 40 {
 41     bool need_bak = true;
 42     FILE* ptr_file = NULL;
 43     size_t fsize = 0;
 44     string bak_name = bak_name_tmp;
 45     bool tmp_false = false;
 46     do
 47     {
 48         fopen_s(&ptr_file, file_path_name.c_str(), "rb");
 49         if (NULL == ptr_file)
 50         {
 51             break;
 52         }
 53 
 54         //get file size
 55         fseek(ptr_file, 0, SEEK_END);
 56         fsize = (ftell(ptr_file));
 57         fseek(ptr_file, 0, SEEK_SET);
 58         if (fsize == 0)
 59         {
 60             fclose(ptr_file);
 61             ptr_file = NULL;
 62             break;
 63         }
 64         need_bak = false;
 65     } while (tmp_false);
 66 
 67     if (need_bak)
 68     {
 69         //assert(0); // 已经属于异常范畴了
 70         if (bak_name.empty())
 71         {
 72             string file_path;
 73             string file_name;
 74             string file_type;
 75             if (!ParseFilePath(file_path_name, file_path, file_name, file_type))
 76             {
 77                 assert(0);
 78                 return false;
 79             }
 80             bak_name = file_path + "/" + file_name + ".data";
 81         }
 82         
 83         fopen_s(&ptr_file, bak_name.c_str(), "rb");
 84         if (NULL == ptr_file)
 85         {
 86             //assert(0);
 87             return false;
 88         }
 89 
 90         //get file size
 91         fseek(ptr_file, 0, SEEK_END);
 92         fsize = (ftell(ptr_file));
 93         fseek(ptr_file, 0, SEEK_SET);
 94     }
 95     if (nullptr == ptr_file)
 96     {
 97         assert(0);
 98         return false;
 99     }
100 
101     if (0 == fsize)
102     {
103         assert(0);
104         fclose(ptr_file);
105         return false;
106     }
107 
108     auto_ptr<char> pBuf(new char[fsize]);
109     memset(pBuf.get(), 0, fsize);
110     size_t read_size = fread(pBuf.get(), 1, fsize, ptr_file);
111     fclose(ptr_file);
112     buf.assign(pBuf.get(), read_size);
113     //buf = string(pBuf.get(), read_size);
114 
115     size_t n_pos = buf.find_last_not_of('\n');
116     if (string::npos != n_pos)
117     {
118         buf = buf.substr(0, n_pos + 1);
119     }
120     return true;
121 }
122 
123 bool CFileBak::WriteFile(const std::string& file_name, const std::string& buf)
124 {
125     HANDLE hfile = CreateFileA(file_name.c_str(), GENERIC_WRITE | GENERIC_READ, 0, 0, OPEN_ALWAYS, FILE_FLAG_NO_BUFFERING, 0);
126     if (INVALID_HANDLE_VALUE == hfile)
127     {
128         assert(0);
129         CloseHandle(hfile);
130         return false;
131     }
132 
133     LARGE_INTEGER large_file_size;
134     if (!GetFileSizeEx(hfile, &large_file_size))
135     {
136         assert(0);
137         CloseHandle(hfile);
138         return false;
139     }
140     size_t n_pos = buf.find_last_not_of('\n');
141 
142     string write_buf;
143     if (string::npos != n_pos)
144     {
145         write_buf = buf.substr(0, n_pos + 1);
146     }
147     else
148     {
149         write_buf = buf;
150     }
151     UINT_T write_size = GetWriteSizeForNoBuf(max(large_file_size.LowPart, static_cast<UINT_T>(write_buf.length())));
152     if (write_size == 0)
153     {
154         assert(0);
155         CloseHandle(hfile);
156         return false;
157     }
158 
159     auto_ptr<char> ptr_write_buf(new char[write_size]);
160     memset(ptr_write_buf.get(), '\n', write_size); // 将换行写在文件中不影响使用,写0都会影响xml的功能
161     memcpy(ptr_write_buf.get(), write_buf.c_str(), write_buf.length());
162 
163     DWORD dwret = 0;
164     ::WriteFile(hfile, ptr_write_buf.get(), write_size, &dwret, NULL);
165     CloseHandle(hfile);
166     return true;
167 }

 

转载于:https://www.cnblogs.com/wangshaowei/p/9073590.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Windows C中实现大文件读写封装可以通过以下步骤来完成。 首先,需要使用Windows提供的API函数来操作文件。其中比较常用的函数有CreateFile、ReadFile和WriteFile等。CreateFile函数用于打开文件并返回一个文件句柄,可根据需要设置打开模式、访问权限等。ReadFile函数用于从文件中读取数据,可以指定要读取的字节数。WriteFile函数用于向文件中写入数据,同样可以指定要写入的字节数。 其次,可以封装一个读取大文件的函数。在该函数中,先通过CreateFile函数打开需要读取的大文件,并获取文件句柄。然后通过循环调用ReadFile函数读取文件内容,直到读取完整个文件。在读取过程中,可以使用一个缓冲区来存储每次读取的数据,避免频繁的文件IO操作。最后,关闭文件句柄,并释放相关资源。 再次,可以封装一个写入大文件的函数。在该函数中,先通过CreateFile函数创建要写入的大文件,并获取文件句柄。然后通过循环调用WriteFile函数将数据写入文件,直到完成全部数据的写入。同样,可以使用一个缓冲区来存储每次要写入的数据,减少文件IO操作次数。最后,关闭文件句柄,并释放相关资源。 此外,为了提高大文件读写的效率,还可以采用多线程或异步IO的方式来并行读写文件。通过将文件分割成多个块,每个块由独立的线程或IO操作来读写,可以同时进行多个读写操作,加快文件读写速度。 综上所述,通过使用Windows提供的API函数,结合封装读写函数以及多线程或异步IO的方式来实现大文件读写封装,可以提高文件IO效率,满足对大文件处理的需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值