OccBufferFileIO.h 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148
  1. #ifndef OCC_BUFFER_FILE_IO_H
  2. #define OCC_BUFFER_FILE_IO_H
  3. #include <iostream>
  4. #include <fstream>
  5. #include <vector>
  6. #include <set>
  7. #include <string>
  8. struct occ_perform_buffer_t {
  9. std::vector<double> points;
  10. std::vector<double> normals;
  11. std::vector<int> elements;
  12. std::set<std::vector<int>> edges;
  13. };
  14. // 写结构体数组和MD5字符串到文件,成功返回true,失败返回false
  15. inline bool writeOccPerformBuffer(const std::vector<occ_perform_buffer_t>& buffers, const std::string& md5, const char* fileName) {
  16. try {
  17. std::ofstream outFile(fileName, std::ios::binary);
  18. if (outFile) {
  19. // 写入结构体数组大小
  20. size_t sizeBuffers = buffers.size();
  21. outFile.write(reinterpret_cast<const char*>(&sizeBuffers), sizeof(sizeBuffers));
  22. for (const auto& buffer : buffers) {
  23. // 写入points向量大小
  24. size_t sizePoints = buffer.points.size();
  25. outFile.write(reinterpret_cast<const char*>(&sizePoints), sizeof(sizePoints));
  26. // 写入points数据
  27. outFile.write(reinterpret_cast<const char*>(buffer.points.data()), buffer.points.size() * sizeof(double));
  28. // 写入normals向量大小
  29. size_t sizeNormals = buffer.normals.size();
  30. outFile.write(reinterpret_cast<const char*>(&sizeNormals), sizeof(sizeNormals));
  31. // 写入normals数据
  32. outFile.write(reinterpret_cast<const char*>(buffer.normals.data()), buffer.normals.size() * sizeof(double));
  33. // 写入elements向量大小
  34. size_t sizeElements = buffer.elements.size();
  35. outFile.write(reinterpret_cast<const char*>(&sizeElements), sizeof(sizeElements));
  36. // 写入elements数据
  37. outFile.write(reinterpret_cast<const char*>(buffer.elements.data()), buffer.elements.size() * sizeof(int));
  38. // 写入edges集合大小
  39. size_t sizeEdges = buffer.edges.size();
  40. outFile.write(reinterpret_cast<const char*>(&sizeEdges), sizeof(sizeEdges));
  41. // 写入edges数据
  42. for (const auto& edge : buffer.edges) {
  43. // 写入每个边向量的大小
  44. size_t edgeSize = edge.size();
  45. outFile.write(reinterpret_cast<const char*>(&edgeSize), sizeof(edgeSize));
  46. // 写入边向量的数据
  47. outFile.write(reinterpret_cast<const char*>(edge.data()), edge.size() * sizeof(int));
  48. }
  49. }
  50. // 写入MD5字符串长度
  51. size_t md5Size = md5.length();
  52. outFile.write(reinterpret_cast<const char*>(&md5Size), sizeof(md5Size));
  53. // 写入MD5字符串数据
  54. outFile.write(md5.c_str(), md5.length());
  55. outFile.close();
  56. return true;
  57. }
  58. else {
  59. std::cerr << "Failed to open the file for writing: " << fileName << std::endl;
  60. return false;
  61. }
  62. }
  63. catch (const std::exception& e) {
  64. std::cerr << "An exception occurred while writing the file: " << e.what() << std::endl;
  65. return false;
  66. }
  67. }
  68. // 从文件读取结构体数组和MD5字符串,成功返回true,失败返回false
  69. inline bool readOccPerformBuffer(std::vector<occ_perform_buffer_t>& buffers, std::string& md5, const char* fileName) {
  70. try {
  71. std::ifstream inFile(fileName, std::ios::binary);
  72. if (inFile) {
  73. // 读取结构体数组大小
  74. size_t sizeBuffers;
  75. inFile.read(reinterpret_cast<char*>(&sizeBuffers), sizeof(sizeBuffers));
  76. buffers.resize(sizeBuffers);
  77. for (auto& buffer : buffers) {
  78. // 读取points向量大小
  79. size_t sizePoints;
  80. inFile.read(reinterpret_cast<char*>(&sizePoints), sizeof(sizePoints));
  81. buffer.points.resize(sizePoints);
  82. // 读取points数据
  83. inFile.read(reinterpret_cast<char*>(buffer.points.data()), buffer.points.size() * sizeof(double));
  84. // 读取normals向量大小
  85. size_t sizeNormals;
  86. inFile.read(reinterpret_cast<char*>(&sizeNormals), sizeof(sizeNormals));
  87. buffer.normals.resize(sizeNormals);
  88. // 读取normals数据
  89. inFile.read(reinterpret_cast<char*>(buffer.normals.data()), buffer.normals.size() * sizeof(double));
  90. // 读取elements向量大小
  91. size_t sizeElements;
  92. inFile.read(reinterpret_cast<char*>(&sizeElements), sizeof(sizeElements));
  93. buffer.elements.resize(sizeElements);
  94. // 读取elements数据
  95. inFile.read(reinterpret_cast<char*>(buffer.elements.data()), buffer.elements.size() * sizeof(int));
  96. // 读取edges集合大小
  97. size_t sizeEdges;
  98. inFile.read(reinterpret_cast<char*>(&sizeEdges), sizeof(sizeEdges));
  99. for (size_t i = 0; i < sizeEdges; ++i) {
  100. // 读取每个边向量的大小
  101. size_t edgeSize;
  102. inFile.read(reinterpret_cast<char*>(&edgeSize), sizeof(edgeSize));
  103. std::vector<int> edge(edgeSize);
  104. // 读取边向量的数据
  105. inFile.read(reinterpret_cast<char*>(edge.data()), edge.size() * sizeof(int));
  106. buffer.edges.insert(edge);
  107. }
  108. }
  109. // 读取MD5字符串长度
  110. size_t md5Size;
  111. inFile.read(reinterpret_cast<char*>(&md5Size), sizeof(md5Size));
  112. // 读取MD5字符串数据
  113. char* md5Str = new char[md5Size + 1];
  114. inFile.read(md5Str, md5Size);
  115. md5Str[md5Size] = '\0';
  116. md5 = md5Str;
  117. delete[] md5Str;
  118. inFile.close();
  119. return true;
  120. }
  121. else {
  122. std::cerr << "Failed to open the file for reading: " << fileName << std::endl;
  123. return false;
  124. }
  125. }
  126. catch (const std::exception& e) {
  127. std::cerr << "An exception occurred while reading the file: " << e.what() << std::endl;
  128. return false;
  129. }
  130. }
  131. #endif#pragma once