1. 程式人生 > >關於c++對文件讀寫的封裝

關於c++對文件讀寫的封裝

hfile value val style urn 兩種 pat pos write

  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 }

關於c++對文件讀寫的封裝