用fstream读文件,然后把数据取出来放到内存上;然后再把数据保存成文件;获取文件大小

543 阅读1分钟
  • 前言,经过了两次的验证,没有问题,关键参数和步骤做了注释
  • 要点:
    • 演示获取fstream文件大小函数
    • 只读文件打开时std::ios::ate | std::ios::in 比较好
    • 文件最好以std::ios::binary打开, 这样操作的数据(图像),才原汁原味
    • 应用了移动文件指针的做法fs.seekg(cur_index, std::ios::beg)
    • 将对象的内存读取出来的做法
      #include <fstream>
      #include <memory>
      #include <stdio.h>
      
      template<typename T>
      uint64_t getFileSize(T& fs)
      {
              uint64_t cur_index = fs.tellg();
              // 注意! 移动文件指针到尾部不能一步到位
              // fs.seekg(std::ios::end);	
              fs.seekg(0, std::ios::end);  
              uint64_t file_size = fs.tellg();	
              fs.seekg(cur_index, std::ios::beg);
              return file_size;
      }
      
      int main()
      {
              std::ifstream fstream_instance("./1.jpg", std::ios::in | std::ios::binary);  
              // 注意! 不宜一来就将文件指针定位到文件尾
              // std::ifstream fstream_instance("./1.jpg", std::ios::ate | std::ios::in | std::ios::binary);
              uint64_t file_size = getFileSize(fstream_instance);	
              printf("file_size: %d \n", file_size);
      
              // 获取当前文件指针位置
              uint64_t cur_index = fstream_instance.tellg();  
              // 注意! 如果文件在打开时,指定 std::ios::ate,那么现在需要将文件指针移动到头部,为接下来读取文件数据作准备了 
              // fstream_instance.seekg(std::ios::beg);
              printf("cur_index: %d \n", cur_index);
              
              // 这种要求掌握自定义删除器的用法即可
              // std::shared_ptr<uint8_t> sp_data(new uint8_t[file_size], [](uint8_t* p_data) {delete[] p_data; });  
              // 推荐用法 
              std::shared_ptr<uint8_t[]> sp_data(new uint8_t[file_size]);
      
              // ifstream 对象数据读到内存上
              fstream_instance.read((char*)(sp_data.get()), file_size);    
              // 注意! 要想完整读取文件不宜用 get(),第三常指定了结束符,默认是0
              // fstream_instance.get((char*)(sp_data.get()), file_size, 0xd9);
      
              // write  
              std::ofstream ofs;
              ofs.open("./2.jpg", std::ios::out | std::ios::binary);
              ofs.write((char*)sp_data.get(), file_size);
              ofs.close();
              fstream_instance.close();
              return 0;  	  
      }
      
    • 参考:ostream::write - C++ Reference (cplusplus.com)