活动介绍

C++17 std::filesystem 如何向文件输出二进制流

时间: 2024-11-12 12:34:40 AIGC 浏览: 83
在C++17中,`std::filesystem`库主要用于处理文件和目录操作,并不是用于直接读写二进制流。如果你想要向文件输出二进制数据,应该使用`std::fstream`或者其他底层I/O库如`std::iostream`或`boost::iostreams`。 以下是使用`std::ofstream`向文件输出二进制数据的一个示例: ```cpp #include <fstream> #include <vector> std::vector<char> binary_data; // 假设这里已经填充了二进制数据 // 创建一个输出文件流 std::ofstream output_file("binary_output.bin", std::ios::binary); // 如果文件打开成功 if (output_file.is_open()) { output_file.write(binary_data.data(), binary_data.size()); output_file.close(); // 关闭文件 } else { std::cerr << "无法打开文件!" << std::endl; } ``` 在这个例子中,我们首先创建了一个`std::ofstream`对象,指定了二进制模式(`std::ios::binary`)以便正确地处理二进制数据。然后通过`write()`函数将二进制数据写入文件。
相关问题

c++ std::ifstream in(fileName, std::ios::in | std::ios::binary | std::ios::ate);异常

在C++中,使用`std::ifstream`打开文件时,传给构造函数如`std::ifstream in(fileName, std::ios::in | std::ios::binary | std::ios::ate)`的模式组合可以引起异常。这里有几个可能的原因和相应的异常: 1. **文件不存在**:如果指定的文件名(fileName)对应的实际文件不存在,`std::ifstream`会抛出`std::filesystem::filesystem_error`或`std::ios_base::failure`异常,因为试图打开一个不存在的文件。 2. **权限不足**:如果当前用户没有足够的权限访问指定的文件,也可能触发类似上述的异常。 3. **磁盘空间不足**:如果硬盘空间不足,试图创建临时文件(例如在`std::ios::ate`模式下),`std::ifstream`也会失败,抛出异常。 4. **文件格式错误**:如果文件不是二进制格式,而你指定了`std::ios::binary`,在读取非二进制数据时可能会引发解析错误。 5. **内存不足**:在尝试从大文件读取数据并且内存不足以缓冲所有内容时,可能会遇到资源限制异常。 处理这种情况,你需要捕获并处理可能出现的异常,例如使用try-catch块: ```cpp try { std::ifstream in(fileName, std::ios::in | std::ios::binary | std::ios::ate); // 文件操作 } catch (const std::exception& e) { std::cerr << "Error opening file: " << e.what() << std::endl; // 处理异常 } ```

使用go编译时,出现typeinfo for std::filesystem::__cxx11::filesystem_error

当你在使用Go编译涉及C++代码的项目时,遇到了类似“undefined reference to typeinfo for std::filesystem::__cxx11::filesystem_error”这样的错误信息,通常意味着链接阶段未能找到所需的符号。这种问题一般出现在使用标准库中的某些特性(如 C++17 引入的标准文件系统库 `<filesystem>`)的情况下。 以下是详细的分析以及如何解决问题的方法: ### 详细原因分析 此类型的未定义引用错误通常由以下几种情况引起: 1. **缺少必要的链接器标志**:尽管你已经在使用 C++17 并且包含了 `<filesystem>` 头文件,但是如果没有正确地告诉链接器去寻找 `std::filesystem` 类的相关实现,则仍然会出现此类错误。 2. **GCC/G++ 版本不足**:较老版本的 GCC/G++ 可能并不完全支持 C++17 的所有特性,特别是 `<filesystem>` 库是在 C++17 中引入的新功能之一。因此需要保证所使用的编译器版本足够新。 3. **静态 vs 动态链接问题**:有些 Linux 发行版默认不会将所有的 C++ 标准库模块都打包进主二进制文件中。这就可能导致你需要显式地添加对特定库的支持才能完成正确的链接操作。 4. **多线程模型差异**:如果你的应用程序是以多线程的方式运行的话,那么你也需要注意确保选择了合适的多线程 ABI(Application Binary Interface),因为不同的设置会影响最终生成的目标代码能否成功解析出这些符号。 ### 解决方案 针对上述几个可能的原因,我们可以采取以下措施来进行修复: #### 确保正确配置 C++ 编译选项 确保你在项目的构建脚本中已经设置了适当的编译和链接标记来启用 C++17 支持,并且能够识别并处理新的标准库组件。例如,在Makefile或Build System配置文件中加入: ```makefile CXXFLAGS += -std=c++17 ``` #### 验证并更新你的 GCC/G++ 确认正在使用的 GCC/G++ 是否最新稳定版本,最好不低于8.x系列。可以执行下面命令查看当前安装的是不是合适版本: ```bash g++ --version ``` 如果不是最近的一个发布版本,请考虑升级至更高版本或者在一个更现代化的工作站上进行开发工作。 #### 添加额外的链接库 (适用于某些Linux发行版) 对于那些没有直接集成完整 C++17 文件系统的旧系统来说,你可以尝试手动添加缺失的部分作为独立的静态库形式供链接器查找。比如,在 Go 源码顶部附近插入如下内容: ```go /* #cgo LDFLAGS: -lstdc++fs -static-libstdc++ */ import "C" ``` 这里我们不仅指定了 `-lstdc++fs` 这一专用库名用于加载文件系统的扩展实现,还加上了 `-static-libstdc++` 参数让整个应用程序尽可能多地捆绑所需的基础函数而无需依赖外部共享对象。 #### 清理并重建项目 最后别忘了清理之前的中间产物后再做一次全新构建动作,防止残留物影响结果的一致性: ```bash go clean rm -rf ./build/ mkdir -p build && cd $_ go build . ``` ### 示例修正后的编译指令 整合前面提到的所有建议之后,假设你想并行化构建过程且限制最大并发数为8个任务,则完整的 `go build` 调用应该类似于这样: ```bash export CGO_ENABLED=1 GO_CXXFLAGS="-std=c++17" GOPKG="path/to/package" go build -v -race -ldflags "-extldflags '-static'" -p 8 ${GOPKG}/main.go ``` > 注释:根据实际情况调整路径和其他参数设定。 --- 希望以上的解释对你有所帮助!如果还有其他问题或者是有关联的技术话题想进一步了解,请随时提问! --
阅读全文

相关推荐

#include <iostream> #include <fstream> #include <opencv2/opencv.hpp> #include "gdal/gdal_priv.h" #pragma comment(lib, "gdal_i.lib") #include <filesystem> #include<tuple> #include <gdal.h> #include <gdal_priv.h> #include <cpl_conv.h> #include <boost/filesystem.hpp> #include "gdal_priv.h" #include "cpl_conv.h" #include #include #include #include using namespace std; using namespace cv; // Function to read data from a txt file and store it in a matrix bool readDataFromFile(const string& filename, Mat& dataMat) { ifstream file(filename); if (!file.is_open()) { cout << "Error: Could not open the file " << filename << endl; return false; } dataMat.create(3, 4, CV_32FC1); for (int i = 0; i < dataMat.rows; ++i) { for (int j = 0; j < dataMat.cols; ++j) { float value; if (!(file >> value)) { cout << "Error: Could not read data properly from the file " << filename << endl; return false; } dataMat.at<float>(i, j) = value; } } file.close(); return true; } // Function to convert disparity map to depth map Mat disparityToDepth(cv::Mat disImg, float baselineLength, float focalLength) { int width = disImg.cols; int height = disImg.rows; std::cout << "distance:" << width << height << std::endl; Mat depthImage = Mat::zeros(height, width, CV_32FC1); std::cout << "断点" << " 6 " << std::endl; for (int row = 0; row < height; ++row) { // std::cout << "断点" << " 7 " << std::endl; for (int col = 0; col < width; ++col) { float distance = 0; distance = disImg.at<float>(row, col); // std::cout << "distance:" << distance << std::endl; if (distance != 0.0) { depthImage.at<float>(row, col) = (baselineLength * focalLength ) / distance; } else { continue; } } } return depthImage; // 返回深度图 } std::vector<Mat> readEplimg(const std::string& folderPath) { GDALAllRegister(); CPLSetConfigOption("GDAL_FILENAME_IS_UTF8", "NO"); //设置支持中文路径和文件名 std::vector<Mat> Eplimg; if (!boost::filesystem::exists(folderPath) || !boost::filesystem::is_directory(folderPath)) { std::cerr << "Error: " << folderPath << " is not a valid directory." << std::endl; return Eplimg; } // 遍历文件夹中的每个文件 boost::filesystem::directory_iterator end_itr; for (boost::filesystem::directory_iterator itr(folderPath); itr != end_itr; ++itr) { if (boost::filesystem::is_regular_file(itr->status()) && (itr->path().extension() == ".tiff" || itr->path().extension() == ".tif")) { std::string filePath = itr->path().string(); // 打开tiff文件 GDALDataset* poDataset = (GDALDataset*)GDALOpenShared(filePath.c_str(), GA_ReadOnly); if (poDataset == nullptr) { std::cerr << "Error opening image " << filePath << std::endl; continue; } // 获取图像宽度和高度 int width = poDataset->GetRasterXSize(); int height = poDataset->GetRasterYSize(); // 获取波段数量 int numBands = poDataset->GetRasterCount(); // 读取图像数据 cv::Mat image(height, width, CV_16U); //poDataset->RasterIO(GF_Read, 0, 0, width, height, image.data, width, height, GDT_UInt16, 0, 0); GDALRasterBand* poBand = poDataset->GetRasterBand(1); poBand->RasterIO(GF_Read, 0, 0, width, height, image.data, width, height, GDT_UInt16, 0, 0); // 关闭文件 GDALClose(poDataset); // 将图像添加到向量中 Eplimg.push_back(image); } } return Eplimg; } cv::Mat readDisparityImage(const std::string& filePath) { GDALAllRegister(); // 打开 TIFF 文件 GDALDataset *disparityDataset = (GDALDataset *)GDALOpen(filePath.c_str(), GA_ReadOnly); if (disparityDataset == NULL) { std::cerr << "无法打开图像文件!" << std::endl; return cv::Mat(); } // 获取图像宽度和高度 int width = disparityDataset->GetRasterXSize(); int height = disparityDataset->GetRasterYSize(); std::cout << "图像尺寸:" << width << " x " << height << std::endl; // 获取第一个波段 // GDALRasterBand *poBand = disparityDataset->GetRasterBand(1); // 获取波段数量 int numBands = disparityDataset->GetRasterCount(); // 读取图像数据 cv::Mat image(height, width, CV_32FC1); GDALRasterBand* poBand = disparityDataset->GetRasterBand(1); GDALDataType g_type = poBand->GetRasterDataType(); // std::cout << "断点" << width << " 1 " << height << std::endl; // float *data = new float [width * height]; // std::cout << "断点" << width << " 2 " << height << std::endl; // poBand->RasterIO(GF_Read, 0, 0, width, height, data, width, height, GDT_Float64, 0, 0); std::cout << "断点" << width << " 3 " << height << std::endl; // 将数据转换为 OpenCV 的 cv::Mat 格式 // cv::Mat img(height, width, CV_64F, data); disparityDataset->GetRasterBand(1)->RasterIO(GF_Read, 0, 0, width, height, image.data, width, height, g_type, 0, 0); poBand->RasterIO(GF_Read, 0, 0, width, height, image.data, width, height, g_type, 0,0); std::cout << "断点" << width << " 4 " << height << std::endl; // 释放内存 // delete[] data; GDALClose(disparityDataset); return image; } std::vector<cv::Mat> readColorImages(const std::string& folderPath) { GDALAllRegister(); CPLSetConfigOption("GDAL_FILENAME_IS_UTF8", "NO"); //设置支持中文路径和文件名 std::vector<cv::Mat> colorImg; if (!boost::filesystem::exists(folderPath) || !boost::filesystem::is_directory(folderPath)) { std::cerr << "Error: " << folderPath << " is not a valid directory." << std::endl; return colorImg; } boost::filesystem::directory_iterator end_itr; for (boost::filesystem::directory_iterator itr(folderPath); itr != end_itr; ++itr) { if (boost::filesystem::is_regular_file(itr->status()) && (itr->path().extension() == ".tiff" || itr->path().extension() == ".tif")) { std::string filePath = itr->path().string(); GDALDataset* poDataset = (GDALDataset*)GDALOpenShared(filePath.c_str(), GA_ReadOnly); if (poDataset == nullptr) { std::cerr << "Error opening image " << filePath << std::endl; continue; } int width = poDataset->GetRasterXSize(); int height = poDataset->GetRasterYSize(); int numBands = poDataset->GetRasterCount(); // 创建一个3通道的Mat矩阵 cv::Mat image(height, width, CV_8UC3); // 逐波段读取数据并存储到Mat矩阵中 for (int b = 1; b <= std::min(numBands, 3); ++b) { // 限制最多读取前3个波段 GDALRasterBand* poBand = poDataset->GetRasterBand(b); poBand->RasterIO(GF_Read, 0, 0, width, height, image.data + (b - 1), width, height, GDT_Byte, 3, width * 3); } // 关闭文件 GDALClose(poDataset); // 将图像添加到向量中 cv::cvtColor(image, image, cv::COLOR_RGB2BGR); // 转换为BGR格式 colorImg.push_back(image); } } return colorImg; } void saveDepthImageWithGDAL(const cv::Mat& depthImage, const std::string& outputPath) { // 初始化 GDAL 库 GDALAllRegister(); // 获取深度图像的尺寸信息 int width = depthImage.cols; int height = depthImage.rows; // 创建输出文件 GDALDriver* driver = GetGDALDriverManager()->GetDriverByName("GTiff"); if (driver == nullptr) { std::cerr << "Error: Could not get GDAL driver." << std::endl; return; } // 创建输出数据集 GDALDataset* dataset = driver->Create(outputPath.c_str(), width, height, 1, GDT_Float32, NULL); if (dataset == nullptr) { std::cerr << "Error: Could not create GDAL dataset." << std::endl; return; } // 将深度图像数据写入到数据集中 float* data = (float*)CPLMalloc(sizeof(float) * width * height); for (int i = 0; i < height; ++i) { for (int j = 0; j < width; ++j) { data[i * width + j] = depthImage.at<float>(i, j); } } GDALRasterBand* band = dataset->GetRasterBand(1); band->RasterIO(GF_Write, 0, 0, width, height, data, width, height, GDT_Float32, 0, 0); // 释放内存和关闭数据集 CPLFree(data); GDALClose(dataset); } void depthToCloudPoint(std::vector<Mat>colorImage,Mat depthImage ,float focalLength_x,float focalLength_y) { pcl::PointCloud::Ptr cloud(new pcl::PointCloud); std::cout << "size:" << depthImage.rows << "x" << depthImage.cols << std::endl; for (int y = 0; y < depthImage.rows; ++y) { for (int x = 0; x < depthImage.cols; ++x) { if (y >= 0 && y < depthImage.rows && x >= 0 && x < depthImage.cols) { // 获取深度值 float depth = depthImage.at <float>(y, x); // 如果深度值为0(无效值),跳过 if (depth == 0.0f) continue; // 计算点云位置 pcl::PointXYZRGB point; point.z = depth; point.x = (x - focalLength_x) * depth / focalLength_x; point.y = (y - focalLength_y) * depth / focalLength_y; std::cout << "size:" << "9" << std::endl; //std::cout << "color:" << colorImage << std::endl; // 获取相应位置的彩色像素值作为颜色 cv::Vec3b color = colorImage[0].at<cv::Vec3b>(y, x); std::cout << "color:" << color << std::endl; point.r = color[2]; point.g = color[1]; point.b = color[0]; std::cout << "color:" << color << std::endl; // 将点添加到点云中 cloud->push_back(point); } } } pcl::io::savePLYFile("pointcloud.ply", *cloud); pcl::io::savePCDFileBinary("point_cloud.pcd", *cloud); pcl::io::savePLYFileBinary("point_cloud.ply", *cloud); std::cout << "Point cloud saved to point_cloud.ply" << std::endl; } int main() { std::vector<Mat> Eplimg = readEplimg("/home/tl/3rdparty/homeworks/build/EpiImg"); std::vector<Mat> colorImage = readColorImages("/home/tl/3rdparty/homeworks/build/EpiImg"); cv::Mat disImg = readDisparityImage("/home/tl/3rdparty/homeworks/build/017ER030_017ER031_DISP_ET0.tif"); // 检查是否成功读取 if (disImg.empty()) { std::cerr << "图像读取失败!" << std::endl; } Mat dataMatleft, dataMatright; if (!readDataFromFile("017ER030_REC.txt", dataMatleft) || !readDataFromFile("017ER031_REC.txt", dataMatright)) { return -1; } Mat K1, R1, t1, K2, R2, t2; decomposeProjectionMatrix(dataMatleft, K1, R1, t1); decomposeProjectionMatrix(dataMatright, K2, R2, t2); Mat B = t1 - t2; float baseline_length = norm(B); float focalLength_x = K1.at<float>(0, 0); // 从相机内参矩阵K1中获取水平方向的焦距 cout << "基线长度: " << baseline_length << endl; cout << "焦距: " << focalLength_x << endl; std::cout << "断点" << " 5 " << std::endl; // 或者 float focalLength_y = K1.at<float>(1, 1); // 从相机内参矩阵K1中获取垂直方向的焦距 Mat depthImage = disparityToDepth(disImg, baseline_length, focalLength_x); // 调用 disparityToDepth 函数获取深度图 // 设置输出路径 std::string outputPath = "output_depth_image.tif"; // 将深度图像保存为图片文件 saveDepthImageWithGDAL(depthImage, outputPath); // 调用函数进行深度图像到点云的转换 depthToCloudPoint(colorImage, depthImage, focalLength_x, focalLength_y); cout << "基线长度: " << baseline_length << endl; cout << "相机内参矩阵 K:" << endl << K1 << endl; cout << "旋转矩阵 R:" << endl << R1 << endl; cout << "平移向量 t:" << endl << t1 << endl; cout << "Data matrix 1:" << endl << dataMatleft << endl; cout << "Data matrix 2:" << endl << dataMatright << endl; return 0; }把这个改为只用opencv库就能实现的代码

boost::property_tree::read_xml(strTmp, pt);加入这个严重性 代码 说明 项目 文件 行 禁止显示状态 详细信息 错误 LNK2019 无法解析的外部符号 "void __cdecl boost::throw_exception(class std::exception const &,struct boost::source_location const &)" (?throw_exception@boost@@YAXAEBVexception@std@@AEBUsource_location@1@@Z),函数 "void __cdecl boost::property_tree::xml_parser::read_xml<class boost::property_tree::basic_ptree<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >,class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >,struct std::less<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > > > >(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const &,class boost::property_tree::basic_ptree<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >,class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >,struct std::less<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > > > &,int,class std::locale const &)" (??$read_xml@V?$basic_ptree@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@V12@U?$less@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@2@@property_tree@boost@@@xml_parser@property_tree@boost@@YAXAEBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@AEAV?$basic_ptree@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@V12@U?$less@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@2@@12@HAEBVlocale@4@@Z) 中引用了该符号 D:\SAMA\sama\build\msvc-Debug\sama D:\SAMA\sama\build\msvc-Debug\copidfunction.cpp.obj 1 错误 LNK1120 1 个无法解析的外部命令 D:\SAMA\sama\build\msvc-Debug\sama D:\SAMA\sama\out\MSVC-Debug\sama.exe 1

if (argc < 2) { return false; } //dcm-series保存路径 std::string filePath1 = argv[1]; std::string filePath = filePath1.substr(0, filePath1.find_last_of("\\") + 1); std::cout << "file Path= " << filePath << std::endl; std::string savePath = filePath ;//+ "1.dcm";//R"(1.dcm)"; // if (_access(savePath.c_str(), 0) == -1) // _mkdir(savePath.c_str()); int width = 4352;//config->ReadInt("Image", "width", 0); int height = 4352;//config->ReadInt("Image", "height", 0); float x_spacing = 1;//config->ReadFloat("Image", "x_spacing", 0); float y_spacing = 1;//config->ReadFloat("Image", "y_spacing", 0); float z_spacing = 0.0; //读取raw文件 unsigned short usMin = 65535; unsigned short usMax = 0; std::cout << "argv[1]: " << argv[1] << std::endl; long nLength = height * width * sizeof(unsigned short); std::ifstream ifile; ifile.open(argv[1], std::ios::binary); if (!ifile.good()) { std::cout<<"not open"<<endl; return -1; } ifile.seekg(0, ifile.end);//seek函数会把标记移动到输入流的结尾 long long lTotalSize = ifile.tellg();// tell会告知整个输入流(从开头到标记)的字节数量 std::cout << "lTotalSize: " << lTotalSize << std::endl; int nFrameNum = lTotalSize / nLength; int nDcmHeaderSize = lTotalSize % nLength; std::cout << "nFrameNum: " << nFrameNum << std::endl; std::cout << "nDcmHeaderSize: " << nDcmHeaderSize << std::endl; unsigned short* pData0 = new unsigned short[lTotalSize]; ifile.seekg(0, ifile.beg);//再把标记移动到流的开始位置 ifile.read(reinterpret_cast<char*>(pData0), lTotalSize); //read函数读取(拷贝)流中的length各字节到buffer ifile.close();

#include <unistd.h> #include <iostream> #include <fstream> #include <vector> #include <chrono> // #include <malloc.h> #include "tool.h" #include "data_manager.h" #include "isa_service.h" #include "mesh_code_manager.h" #include "isa_dbconfig_def.h" namespace lantu { namespace isa { // constexpr size_t JsonSize = 3000; std::string EraseSpace(const std::string& estr) { std::string ret(estr); if (ret.length() > 0) { ret.erase(0, ret.find_first_not_of(" ")); ret.erase(ret.find_last_not_of(" ") + 1); } return ret; } /** * @brief 用于开辟线程加载数据 */ void ForGetDataByRange(const Point& position) { DataManager::getinstance()->GetDataByDataRange(position); return; } /** * @brief 用于开辟线程加载时区和数据版本管理表数据 */ void ForGetCountryTimezoneAndVersion() { DataManager::getinstance()->LoadTimezoneAndVersionMng(); return; } /*Data manager*/ DataManager::DataManager() : // mCurrentCountryCode(""), mDataBaseName(""), mCurrentTileId(0), mIsCrossBorder(false), // mCurrentCountryType(NaviCountryType::Unknown), // mIsaSeviceStatus(ISASeviceStatus::Unknown), mDataThread(1, "IsaDbMngThread") { mDbPath = gISADbConfig.DBPath; InitConfig(); mCountryMngDbPath = mDbPath + gISADbConfig.CountryDataMng; mLoader = std::make_shared<DataLoader>(); mCountryMngLoader = std::make_shared<CountryMngLoader>(); WriteAndroidLog(2, "DataManager start"); //if (InitConfig()) { if (mCountryMngLoader->Connect(mCountryMngDbPath)) { // if (!mCountryMngLoader->LoadCountryVersionMng(mCountryVersionMap)) { // WriteAndroidLog(4,"Load CountryVersionMng false!"); // } std::thread loadTVFunc(ForGetCountryTimezoneAndVersion); loadTVFunc.detach(); } else { printf("ERROR:Connect CountryMngDb false!\n"); WriteAndroidLog(4, "Connect CountryMngDb false!"); } // InitService(); //WriteAndroidLog(2, "Init Config success!"); //} } DataManager::~DataManager() { mDataThread.DetachThreadPool(); mCountryMngDbPath = ""; mIsCrossBorder = false; // mCurrentCountryCode = ""; mDbPath = ""; mDataBaseName = ""; mCurrentTileId = 0; //mCountryNameMap.clear(); mMeshDataMap.clear(); //mMeshCountryMap.clear(); mDataTileIdSet.clear(); mCountryTimezoneMap.clear(); mLoader->Disconnect(); mCountryMngLoader->Disconnect(); WriteAndroidLog(2, "DataManager end"); printf("Tip:DataManager end!\n"); } //2024-06-20:配置文件转为头文件定义 bool DataManager::InitConfig() { std::string configPath(""); std::string configValue(""); std::string dbPathtag("Db_Path"); #ifdef __ANDROID__ configPath = "/inand/db_config.ini"; #else configPath = "./db_config.ini"; #endif //!defined(__ANDROID__) std::ifstream ifs(configPath.c_str(), std::ios::in); if (!ifs || !ifs.is_open()) { // 以写入模式创建文件 std::ofstream outfile(configPath); if (outfile.is_open()) { #ifdef __ANDROID__ outfile << "Db_Path = /inand/"; #else outfile << "Db_Path = ../ISA_Engine/etc/"; #endif outfile.close(); // 关闭文件 } else { WriteAndroidLog(4, "DataManager: Open config file false!"); } #ifdef __ANDROID__ mDbPath = "/inand/"; #else mDbPath = "../ISA_Engine/etc/"; #endif return true; } while (getline(ifs, configValue)) { if (strcmp(configValue.c_str(), "") == 0 || configValue.find("#") == 0 || configValue.find("[") == 0) { continue; } if (configValue.find(dbPathtag, 0) == 0) { size_t tag = configValue.find("=", 0); std::string tagConfigValue = configValue.substr(tag + 1); std::string dbpathstr = EraseSpace(tagConfigValue); if (dbpathstr.find_last_of("/") != dbpathstr.length() - 1) { mDbPath = dbpathstr + "/"; } else { mDbPath = dbpathstr; } break; } // else if (configValue.find(countryMngNameDbTag, 0) == 0) { // size_t tag = configValue.find("=", 0); // DataSetName dbname = configValue.substr(tag + 1); // countrymngdbname = EraseSpace(dbname); // } else { // size_t tag = configValue.find("=", 0); // std::string ccodTag = configValue.substr(0, tag); // CountryCode cCod = EraseSpace(ccodTag); // std::string dbnameTag = configValue.substr(tag + 1); // DataSetName dbName = EraseSpace(dbnameTag); // mCountryNameMap[cCod] = dbName; // } } ifs.clear(); ifs.close(); return true; } //2024-06-20:配置文件转为头文件定义 bool DataManager::setDbPath2Config(std::string dbPath) { if (dbPath.empty()) return false; std::string configPath(""); std::string dbPathtag("Db_Path"); if (dbPath.find_last_of("/") != dbPath.length() - 1) { mDbPath = dbPath + "/"; } else { mDbPath = dbPath; } #ifdef __ANDROID__ configPath = "/inand/db_config.ini"; #else configPath = "./db_config.ini"; #endif //!defined(__ANDROID__) std::ofstream outfile(configPath, std::ios::out | std::ios::trunc); if (!outfile || !outfile.is_open()) { WriteAndroidLog(4, "setDbPath2Config:File open error, path:" + dbPath); return false; } outfile << dbPathtag + " = " + mDbPath; outfile.clear(); outfile.close(); return true; } std::string DataManager::getDbPath2Config() { return mDbPath; } bool DataManager::InitDb(const Point& position) { mCurrentPoint = position; TileID tileId; MCLEVEL lv = LEVEL_ONE; GetMeshCode gmc; tileId = gmc.getMeshCode(position.x, position.y, lv); bool ret(false); /*initdb时不定位当前国家,后续根据定位匹配的道路获取国家编码*/ std::vector<CountryCode> bufcountryVec; if (mCountryMngLoader->LoadMeshCountryMngByTileId(tileId, bufcountryVec)) { if (bufcountryVec.size() == 1) { NaviCountryType ctype = PaseraNaviCountryType(bufcountryVec[0]); IsaService::getinstance()->SetCountryType(ctype); } else { IsaService::getinstance()->SetCountryType(NaviCountryType::Unknown); } } if (GetDataByDataRange(position)) { mCurrentTileId = tileId; ret = true; } return ret; } bool DataManager::DetachDb() { std::map<TileID, DataCollection>().swap(mMeshDataMap); mDataTileIdSet.clear(); // malloc_trim(0); /*归还堆内存*/ return mLoader->Disconnect(); } void DataManager::DetachManager() { mDataThread.DetachThreadPool(); mCountryMngDbPath = ""; mIsCrossBorder = false; // mCurrentCountryCode = ""; mDbPath = ""; mCurrentTileId = 0; //mCountryNameMap.clear(); mMeshDataMap.clear(); //mMeshCountryMap.clear(); mDataTileIdSet.clear(); mLoader->Disconnect(); WriteAndroidLog(2, "DataManager end"); printf("Tip:DataManager end!\n"); } bool DataManager::GetRoadsByTileId(const TileID tileId, const Point& position, std::vector<RoadPtr>& roads) { // roads.clear(); mDataMutex.lock(); bool ret(false); auto dataItr = mMeshDataMap.find(tileId); if (dataItr == mMeshDataMap.end()) { mDataMutex.unlock(); if (SyncDataByPosition(position)) { mDataMutex.lock(); dataItr = mMeshDataMap.find(tileId); } else { mDataMutex.lock(); } } if (dataItr != mMeshDataMap.end()) { for(const auto& road : dataItr->second.mRoadMap) { roads.emplace_back(road.second); } /*for finding the roads that stride over tile -- kvm_v1.1 */ if (!dataItr->second.mMainTileRoadMap.empty()) { for (auto tileroad : dataItr->second.mMainTileRoadMap) { auto otherItr = mMeshDataMap.find(tileroad.second); if (otherItr == mMeshDataMap.end()) { DataCollection data; if (GetDataByTileId(tileroad.second, data)) { mMeshDataMap[tileroad.second] = std::move(data); mDataTileIdSet.insert(tileroad.second); } otherItr = mMeshDataMap.find(tileroad.second); } if (otherItr != mMeshDataMap.end()) { auto roadpair = otherItr->second.mRoadMap.find(tileroad.first); if (roadpair != otherItr->second.mRoadMap.end()) { roads.emplace_back(roadpair->second); } } } } /*kvm_v1.1 end*/ ret = true; } mDataMutex.unlock(); if (!SyncDataByPosition(position)) { #ifdef __ANDROID__ std::string logstr = "SyncDataByPosition(" + std::to_string(position.x) + "," + std::to_string(position.y) + ") failed!"; WriteAndroidLog(4, logstr); #else printf("ERROR:SyncDataByPosition false!\n"); #endif //__ANDROID__ } return ret; } // bool DataManager::GetRoadByRoadId(const Point& position, const RoadID& roadId, RoadPtr& road) { // bool ret(false); // MCLEVEL lv = LEVEL_ONE; // GetMeshCode gmc; // TileID tileId = gmc.getMeshCode(position.x, position.y, lv); // mDataMutex.lock(); // auto dataItr = mMeshDataMap.find(tileId); // // if (dataItr == mMeshDataMap.end()) { // // mDataMutex.unlock(); // // } // if (dataItr != mMeshDataMap.end()) { // auto roadItr = dataItr->second.mRoadMap.find(roadId); // if (roadItr == dataItr->second.mRoadMap.end()) { // /*for KVM_V1.1*/ // if (!dataItr->second.mMainTileRoadMap.empty()) { // auto troadItr = dataItr->second.mMainTileRoadMap.find(roadId); // if (troadItr != dataItr->second.mMainTileRoadMap.end()) { // DataCollection data; // if (GetDataByTileId(troadItr->second, data)) { // auto roadbuf = data.mRoadMap.find(roadId); // if (roadbuf != data.mRoadMap.end()) { // road = roadbuf->second; // ret = true; // } // mMeshDataMap[troadItr->second] = std::move(data); // mDataTileIdSet.insert(troadItr->second); // } // } // } // /*end*/ // if (!ret) { // for (const auto dataMap:mMeshDataMap) { // if (dataMap.first == tileId) continue; // auto roadItr = dataMap.second.mRoadMap.find(roadId); // if (roadItr != dataMap.second.mRoadMap.end()) { // road = roadItr->second; // ret = true; // break; // } // } // } // } else { // road = roadItr->second; // ret = true; // } // } // mDataMutex.unlock(); // if (!SyncDataByPosition(position)) { // #ifdef __ANDROID__ // std::string logstr = "SyncDataByPosition(" + std::to_string(position.x) + "," + std::to_string(position.y) + ") failed!"; // WriteAndroidLog(4, logstr); // #else // printf("ERROR:SyncDataByPosition false!\n"); // #endif //__ANDROID__ // } // return ret; // } bool DataManager::GetRoadByRoadId(const Point& position, const Point& s_node, const Point& e_node, const RoadID& roadId, RoadPtr& road) { bool ret(false); MCLEVEL lv = LEVEL_ONE; GetMeshCode gmc; TileID tileId = gmc.getMeshCode(position.x, position.y, lv); mDataMutex.lock(); auto dataItr = mMeshDataMap.find(tileId); // if (dataItr == mMeshDataMap.end()) { // mDataMutex.unlock(); // } if (dataItr != mMeshDataMap.end()) { auto roadItr = dataItr->second.mRoadMap.find(roadId); if (roadItr == dataItr->second.mRoadMap.end()) { //算e点 TileID e_tile = gmc.getMeshCode(e_node.x, e_node.y, lv); auto e_dataItr = mMeshDataMap.find(e_tile); if (e_dataItr != mMeshDataMap.end()) { auto e_roadItr = e_dataItr->second.mRoadMap.find(roadId); if (e_roadItr != e_dataItr->second.mRoadMap.end()) { road = e_roadItr->second; ret = true; } } if (!ret) { //算s点 TileID s_tile = gmc.getMeshCode(s_node.x, s_node.y, lv); auto s_dataItr = mMeshDataMap.find(s_tile); if (s_dataItr != mMeshDataMap.end()) { auto s_roadItr = s_dataItr->second.mRoadMap.find(roadId); if (s_roadItr != s_dataItr->second.mRoadMap.end()) { road = s_roadItr->second; ret = true; } } } /*end*/ if (!ret) { /*for KVM_V1.1*/ if (!dataItr->second.mMainTileRoadMap.empty()) { auto troadItr = dataItr->second.mMainTileRoadMap.find(roadId); if (troadItr != dataItr->second.mMainTileRoadMap.end()) { DataCollection data; if (GetDataByTileId(troadItr->second, data)) { auto roadbuf = data.mRoadMap.find(roadId); if (roadbuf != data.mRoadMap.end()) { road = roadbuf->second; ret = true; } mMeshDataMap[troadItr->second] = std::move(data); mDataTileIdSet.insert(troadItr->second); } } } } } else { road = roadItr->second; ret = true; } } mDataMutex.unlock(); if (!SyncDataByPosition(position)) { #ifdef __ANDROID__ std::string logstr = "SyncDataByPosition(" + std::to_string(position.x) + "," + std::to_string(position.y) + ") failed!"; WriteAndroidLog(4, logstr); #else printf("ERROR:SyncDataByPosition false!\n"); #endif //__ANDROID__ } return ret; } bool DataManager::GetDataByDataRange(const Point& position) { // auto st = std::chrono::high_resolution_clock::now(); GetMeshCode gMesh; TileID tileId = gMesh.getMeshCode(position.x, position.y, MCLEVEL::LEVEL_ONE); std::set<TileID> tileIdSet{}; int8_t range = int8_t(DataRange / 2); for (int8_t i = -range; i <= range; ++i) { for (int8_t j = -range; j <= range; ++j) { TileID netileid = gMesh.GetNearMeshID(i, j); tileIdSet.insert(netileid); } } // if (tileIdSet.empty()) { // WriteAndroidLog(4, "Get NearMeshID false!"); // return false; // } // if (InitDb(tileId, position)) { mTileIdSetMutex.lock(); std::set<TileID> insTileIdSet{}; std::set<TileID> eraTileIdSet{}; if (mDataTileIdSet.empty()) { insTileIdSet = tileIdSet; mDataTileIdSet = std::move(tileIdSet); } else { for (auto esetItr = mDataTileIdSet.begin(); esetItr != mDataTileIdSet.end(); esetItr++) { std::set<TileID>::iterator idItr = tileIdSet.find(*esetItr); if (idItr == tileIdSet.end()) { TileID tileid = (*esetItr); eraTileIdSet.insert(tileid); } } for (auto isetItr = tileIdSet.begin(); isetItr != tileIdSet.end(); isetItr++) { std::set<TileID>::iterator idItr = mDataTileIdSet.find(*isetItr); if (idItr == mDataTileIdSet.end()) { TileID tileid = (*isetItr); insTileIdSet.insert(tileid); } } } std::vector<std::pair<TileID, DataCollection>> meshDataVec; std::vector<std::pair<TileID, std::map<CountryCode, std::vector<ShapePointVec>>>> countrymngDataVec; DataSetName dataName(""); if (!insTileIdSet.empty()) { for (auto setItr = insTileIdSet.begin(); setItr != insTileIdSet.end(); setItr++) { bool dataflag(false); TileID itileId = (*setItr); DataCollection databuf; if (GetDataByTileId(itileId, databuf)) { // dataflag = true; meshDataVec.emplace_back(std::make_pair(itileId, databuf)); mDataTileIdSet.insert(itileId); } /*代码转移至GetDataByTileId()中*/ // std::map<CountryCode, std::vector<ShapePointVec>> bufcountryshMap; // if (mCountryMngLoader->LoadMeshCountryMngByTileId(itileId, bufcountryshMap)) { // countrymngDataVec.emplace_back(std::make_pair(itileId, bufcountryshMap)); // /*Realizing true nine grid data --20240131*/ // if (!bufcountryshMap.empty()) { // for (auto & counpair : bufcountryshMap) { // // if (std::strcmp(counpair.first.c_str(), mCurrentCountryCode.c_str()) != 0) { // auto dbnitr = mCountryNameMap.find(counpair.first); // if (dbnitr == mCountryNameMap.end()) continue; // if (dataName != dbnitr->second) { // dataName = dbnitr->second; // std::string dbpath = mDbPath + dbnitr->second; // mLoader->Disconnect(); // if (mLoader->Connect(dbpath)) { // DataCollection otdatabuf; // if (GetDataByTileId(itileId, otdatabuf)) { // try { // /* code */ // databuf.mRoadMap.insert(otdatabuf.mRoadMap.begin(), otdatabuf.mRoadMap.end()); // databuf.mRoadConnectMap.insert(otdatabuf.mRoadConnectMap.begin(), otdatabuf.mRoadConnectMap.end()); // databuf.mMainTileRoadMap.insert(otdatabuf.mMainTileRoadMap.begin(), otdatabuf.mMainTileRoadMap.end()); // databuf.mSpeedConditionMap.insert(otdatabuf.mSpeedConditionMap.begin(), otdatabuf.mSpeedConditionMap.end()); // databuf.mTimeConditionMap.insert(otdatabuf.mTimeConditionMap.begin(), otdatabuf.mTimeConditionMap.end()); // dataflag = true; // mDataTileIdSet.insert(itileId); // } catch(const std::exception& e) { // std::cerr << e.what() << '\n'; // WriteAndroidLog(4, "Realizing true nine grid data failed!"); // } // } // // mLoader->Disconnect(); // } // } else { // DataCollection otdatabuf; // if (GetDataByTileId(itileId, otdatabuf)) { // try { // /* code */ // databuf.mRoadMap.insert(otdatabuf.mRoadMap.begin(), otdatabuf.mRoadMap.end()); // databuf.mRoadConnectMap.insert(otdatabuf.mRoadConnectMap.begin(), otdatabuf.mRoadConnectMap.end()); // databuf.mMainTileRoadMap.insert(otdatabuf.mMainTileRoadMap.begin(), otdatabuf.mMainTileRoadMap.end()); // databuf.mSpeedConditionMap.insert(otdatabuf.mSpeedConditionMap.begin(), otdatabuf.mSpeedConditionMap.end()); // databuf.mTimeConditionMap.insert(otdatabuf.mTimeConditionMap.begin(), otdatabuf.mTimeConditionMap.end()); // dataflag = true; // mDataTileIdSet.insert(itileId); // } catch(const std::exception& e) { // std::cerr << e.what() << '\n'; // WriteAndroidLog(4, "Realizing true nine grid data failed!"); // } // } // } // // } // } // } // /*end --*/ // } // if (dataflag) { // meshDataVec.emplace_back(std::make_pair(itileId, databuf)); // } } } /*load map data*/ mDataMutex.lock(); if (!meshDataVec.empty()) { if (!eraTileIdSet.empty()) { for (auto setItr = eraTileIdSet.begin(); setItr != eraTileIdSet.end(); setItr++) { TileID etileId = (*setItr); mMeshDataMap.erase(etileId); mDataTileIdSet.erase(etileId); } } mMeshDataMap.insert(meshDataVec.begin(), meshDataVec.end()); } mDataMutex.unlock(); /*load countrymng data*/ /*不再需要边境线定位当前国家*/ // mSyncMngMutex.lock(); // if (!eraTileIdSet.empty()) { // for (auto setItr = eraTileIdSet.begin(); setItr != eraTileIdSet.end(); setItr++) { // TileID etileId = (*setItr); // mMeshCountryMap.erase(etileId); // } // } // if (!countrymngDataVec.empty()) { // mMeshCountryMap.insert(countrymngDataVec.begin(), countrymngDataVec.end()); // } // mSyncMngMutex.unlock(); // } mTileIdSetMutex.unlock(); // auto et = std::chrono::high_resolution_clock::now(); // uint64_t t = std::chrono::duration_cast<std::chrono::milliseconds>(et - st).count(); // printf("cost time: %ld\n", t); bool ret(false); if (!mMeshDataMap.empty()) ret = true; return ret; } bool DataManager::GetDataByTileId(TileID tileId, DataCollection& data) { auto tileItr = mMeshDataMap.find(tileId); bool ret(false); #ifdef _READ_BIN_ if (tileItr == mMeshDataMap.end()) { /*在获取该tile的数据时取全*/ std::vector<CountryCode> bufcountryVec; mSyncMngMutex.lock(); if (mCountryMngLoader->LoadMeshCountryMngByTileId(tileId, bufcountryVec)) { /*Realizing true nine grid data --20240131*/ if (!bufcountryVec.empty()) { for (auto & counpair : bufcountryVec) { auto dbnitr = gISADbConfig.CountryListMap.find(counpair); if (dbnitr == gISADbConfig.CountryListMap.end()) continue; std::map<RoadID, RoadPtr> roadMap; std::map<NodeID, std::vector<RoadID>> connectMap; std::map<RoadID, TileID> mainTileRoadMap; std::map<ConditionID, SpeedConditionPtr> speedConditionMap; std::map<ConditionID, std::vector<TimeConditionPtr>> timeConditionMap; if (mDataBaseName != dbnitr->second) { mDataBaseName = dbnitr->second; std::string dbpath = mDbPath + dbnitr->second; mLoader->Disconnect(); if (mLoader->Connect(dbpath)) { // DataCollection otdatabuf; ret = mLoader->LoadBinDataByTileId(tileId, roadMap, connectMap, mainTileRoadMap, speedConditionMap, timeConditionMap); if (ret) { // try { /* code */ data.mRoadMap.insert(roadMap.begin(), roadMap.end()); data.mRoadConnectMap.insert(connectMap.begin(), connectMap.end()); data.mMainTileRoadMap.insert(mainTileRoadMap.begin(), mainTileRoadMap.end()); data.mSpeedConditionMap.insert(speedConditionMap.begin(), speedConditionMap.end()); data.mTimeConditionMap.insert(timeConditionMap.begin(), timeConditionMap.end()); // } catch(const std::exception& e) { // std::cerr << e.what() << '\n'; // WriteAndroidLog(5, "Realizing data failed!, tileid(" + std::to_string(tileId) + ")"); // } } else { WriteAndroidLog(4, "Load data by tileid(" + std::to_string(tileId) + ") failed!"); } } } else { // DataCollection otdatabuf; ret = mLoader->LoadBinDataByTileId(tileId, roadMap, connectMap, mainTileRoadMap, speedConditionMap, timeConditionMap); if (ret) { // try { /* code */ data.mRoadMap.insert(roadMap.begin(), roadMap.end()); data.mRoadConnectMap.insert(connectMap.begin(), connectMap.end()); data.mMainTileRoadMap.insert(mainTileRoadMap.begin(), mainTileRoadMap.end()); data.mSpeedConditionMap.insert(speedConditionMap.begin(), speedConditionMap.end()); data.mTimeConditionMap.insert(timeConditionMap.begin(), timeConditionMap.end()); // } catch(const std::exception& e) { // std::cerr << e.what() << '\n'; // WriteAndroidLog(5, "Realizing data failed!, tileid(" + std::to_string(tileId) + ")"); // } } else { WriteAndroidLog(4, "Load data by tileid(" + std::to_string(tileId) + ") failed!"); } } } } /*end --*/ } mSyncMngMutex.unlock(); } // if (tileItr == mMeshDataMap.end()) { // std::map<RoadID, RoadPtr> roadMap; // std::map<NodeID, std::vector<RoadID>> connectMap; // std::map<RoadID, TileID> mainTileRoadMap; // std::map<ConditionID, SpeedConditionPtr> speedConditionMap; // std::map<ConditionID, std::vector<TimeConditionPtr>> timeConditionMap; // ret = mLoader->LoadBinDataByTileId(tileId, roadMap, connectMap, mainTileRoadMap, speedConditionMap, timeConditionMap); // if (ret) { // data.mRoadMap = std::move(roadMap); // data.mRoadConnectMap = std::move(connectMap); // data.mMainTileRoadMap = std::move(mainTileRoadMap); // data.mSpeedConditionMap = std::move(speedConditionMap); // data.mTimeConditionMap = std::move(timeConditionMap); // } else { // printf ("ERRO: LoadBinDataByTileId false!\n"); // WriteAndroidLog("ERRO","LoadBinDataByTileId false!"); // } // } #endif //_READ_BIN_ #ifdef _READ_TABLE_ if (tileItr == mMeshDataMap.end()) { DataCollection dataCol; if (mLoader->LoadRoadByTileId(tileId, dataCol.mRoadMap)) { for(const auto& road : dataCol.mRoadMap) { mLoader->LoadSpeedConditionByRoadId(road.first, dataCol.mSpeedConditionMap); } for (const auto& condition : dataCol.mSpeedConditionMap) { mLoader->LoadTimeConditionByConditionId(condition.first, dataCol.mTimeConditionMap); } data = std::move(dataCol); ret = true; } } #endif //_READ_TABLE_ return ret; } /*舍弃说明:读取九宫格数据中包含的所有国家的地图数据,由定位地图匹配获取的道路来定位当前国家--20240202*/ // bool DataManager::LocateCurrentCountry(const TileID tileId, const Point& position, CountryCode& countryCode, DataSetName& dataName) { // } bool DataManager::GetTimeConditionByCondition(const TileID& tileId, const ConditionID& conditionId, std::vector<TimeConditionPtr>& timeConds) { bool ret(false); // TileID tileId = currentRoad->mTileId; auto dataItr = mMeshDataMap.find(tileId); // if (dataItr == mMeshDataMap.end()) { // std::vector<RoadPtr> roads; // if (GetRoadsByTileId(tileId, position, roads)) { // dataItr = mMeshDataMap.find(tileId); // } // } if (dataItr != mMeshDataMap.end()) { auto timeCondItr = dataItr->second.mTimeConditionMap.find(conditionId); if(timeCondItr != dataItr->second.mTimeConditionMap.end()) { timeConds.insert(timeConds.end(), timeCondItr->second.begin(), timeCondItr->second.end()); } ret = true; } return ret; } bool DataManager::GetSpeedConditionByRoad(const RoadPtr& currentRoad,/* const Point& position,*/std::vector<SpeedConditionPtr>& speedConds) { bool ret(false); TileID tileId = currentRoad->mTileId; auto dataItr = mMeshDataMap.find(tileId); // if (dataItr == mMeshDataMap.end()) { // std::vector<RoadPtr> roads; // if (GetRoadsByTileId(tileId, position, roads)) { // dataItr = mMeshDataMap.find(tileId); // } // } if (dataItr != mMeshDataMap.end()) { for (auto& conds:currentRoad->mRoadSpeedCondVec) { auto speedItr = dataItr->second.mSpeedConditionMap.find(conds); if(speedItr != dataItr->second.mSpeedConditionMap.end()) { speedConds.emplace_back(speedItr->second); } } ret = true; } return ret; } /*0620:版本号不存在管理表中 bool DataManager::GetCountryVer(const CountryCode& countryCd, VersionNum& countryVer) { if (mCountryVersionMap.empty()) return false; bool ret(false); NaviCountryType counType = PaseraNaviCountryType(countryCd); auto verItr = mCountryVersionMap.find(counType); if (verItr != mCountryVersionMap.end()) { countryVer = verItr->second; ret = true; } return ret; } */ bool DataManager::GetCountryDataVer(std::map<CountryCode, VersionNum>& dataVerMap) { /*todo:构建一个临时数据读取类读取*/ mSyncMngMutex.lock(); for (auto countrypair : gISADbConfig.CountryListMap) { mLoader->Disconnect(); std::string path = mDbPath + countrypair.second; if (mLoader->Connect(path)) { std::pair<CountryCode, VersionNum> verpair; if (mLoader->LoadVersionMng(verpair)) { dataVerMap.insert(verpair); } else { WriteAndroidLog(4, "文件损坏:" + countrypair.second); } } } mLoader->Disconnect(); mDataBaseName = ""; mSyncMngMutex.unlock(); return !dataVerMap.empty(); } bool DataManager::GetRoadConnectShipByTileId(const TileID tileId, std::map<NodeID, std::vector<RoadID>>& roadConnectMap, std::map<RoadID, RoadPtr>& roadsMap) { bool ret(false); auto tileItr = mMeshDataMap.find(tileId); if (tileItr != mMeshDataMap.end()) { if (!tileItr->second.mRoadConnectMap.empty() && !tileItr->second.mRoadMap.empty()) { roadConnectMap = tileItr->second.mRoadConnectMap; roadsMap = tileItr->second.mRoadMap; ret = true; } if (!tileItr->second.mMainTileRoadMap.empty()) { for (auto tileroad : tileItr->second.mMainTileRoadMap) { auto otherItr = mMeshDataMap.find(tileroad.second); if (otherItr == mMeshDataMap.end()) { DataCollection data; if (GetDataByTileId(tileroad.second, data)) { mMeshDataMap[tileroad.second] = std::move(data); mDataTileIdSet.insert(tileroad.second); } otherItr = mMeshDataMap.find(tileroad.second); } if (otherItr != mMeshDataMap.end()) { auto roadpair = otherItr->second.mRoadMap.find(tileroad.first); if (roadpair != otherItr->second.mRoadMap.end()) { roadsMap.insert(std::make_pair(roadpair->first, roadpair->second)); } } } } } return ret; } bool DataManager::SyncDataByPosition(const Point& position) { if (mCurrentPoint == position /*&& strcmp(mCurrentCountryCode.c_str(), "") != 0*/) { // std::this_thread::sleep_for(std::chrono::milliseconds(10)); return true; } mCurrentPoint = position; TileID tileId; MCLEVEL lv = LEVEL_ONE; GetMeshCode gmc; tileId = gmc.getMeshCode(position.x, position.y, lv); bool ret(false); DataSetName dbName(""); CountryCode countryCode(""); if (mCurrentTileId != tileId) { if (mMeshDataMap.find(tileId) == mMeshDataMap.end()) { if (GetDataByDataRange(position)) { mCurrentTileId = tileId; ret = true; } } else { mDataThread.enqueue(ForGetDataByRange, position); mCurrentTileId = tileId; ret = true; } } else { ret = true; } return ret; } bool DataManager::GetTimezoneByCountry(const NaviCountryType& countryType, UTCTimeZone& timezone) { mCountryCodeMutex.lock(); bool ret(false); auto tzItr = mCountryTimezoneMap.find(countryType); if (tzItr != mCountryTimezoneMap.end()) { timezone = tzItr->second; ret = true; } mCountryCodeMutex.unlock(); return ret; } void DataManager::LoadTimezoneAndVersionMng() { mCountryCodeMutex.lock(); /*0620:新数据管理表中删除了各个国家数据版本管理表 if (!mCountryMngLoader->LoadCountryVersionMng(mCountryVersionMap)) { WriteAndroidLog(4,"Load CountryVersionMng false!"); } */ if (!mCountryMngLoader->LoadCountryTimezoneMng(mCountryTimezoneMap)) { WriteAndroidLog(4,"Load CountryTimezoneMap false!"); } mCountryCodeMutex.unlock(); return ; } VersionNum DataManager::GetCountryVersion(const CountryCode& ccode) { auto countrypair = gISADbConfig.CountryListMap.find(ccode); if (countrypair == gISADbConfig.CountryListMap.end()) return 0; mSyncMngMutex.lock(); VersionNum ver(0); mLoader->Disconnect(); std::string path = mDbPath + countrypair->second; if (mLoader->Connect(path)) { std::pair<CountryCode, VersionNum> verpair; if (mLoader->LoadVersionMng(verpair)) { ver = verpair.second; } } mLoader->Disconnect(); mDataBaseName = ""; mSyncMngMutex.unlock(); return ver; } bool DataManager::checkCountryDB() { std::vector<CountryCode> bufcountryVec; return mCountryMngLoader->LoadMeshCountryMngByTileId(GetMeshCode().getMeshCode(0.0, 0.0, LEVEL_ONE), bufcountryVec); } /*Data manager End*/ } } 总结代码涉及的所有路径相关的信息

最新推荐

recommend-type

BRAPH 2.0 is a comprehensive software package for the analys

BRAPH 2.0 is a comprehensive software package for the analysis and visualization of brain connectivity data, offering flexible customization, rich visualization capabilities, and a platform for collaboration in neuroscience research..zip
recommend-type

Info2007v1.0更新至v2.0:优化管理与前台功能

根据提供的文件信息,可以挖掘出以下知识点: ### 标题知识点: 1. **免费时代WEB程序INFO2007 V1.0:** - 该标题表明存在一个名为INFO2007的WEB程序版本1.0,该版本是在免费时代推出的,可能意味着该程序是开源的或者提供免费下载。 ### 描述知识点: 1. **软件缺陷说明:** - 开发者提到程序存在BUG(程序缺陷),并提供了一个更新和反馈的渠道,说明软件仍在开发中,且有后续版本计划。 2. **联系方式:** - 开发者提供了QQ和邮箱作为联系方式,用于反馈问题或询问更新情况。 3. **Info2007v2.0更新内容:** - 提及了升级后的版本INFO2007v2.0新增功能,包括数据库结构变化(添加会员和公告表)、后台管理功能的增加与优化、前台功能的增加与优化等。 4. **安装要求:** - 软件需要特定的服务器环境支持,比如FSO(文件系统对象)、数据采集功能和JMAIL(邮件发送组件)。 5. **配置与安装细节:** - 对config.asp下的目录配置和pageurlsa变量做了说明,这些通常涉及程序的运行环境和安全设置。 6. **默认登录信息:** - 提供了默认的管理员用户名和密码,以及后台管理的默认目录,这对于安装和测试程序很重要。 7. **使用前的必要步骤:** - 强调了解压后生成静态页面的重要性,这可能是确保网站内容可被正确浏览的前置操作。 ### 标签知识点: 1. **ASP源码其他类别:** - 这表明该程序使用ASP(Active Server Pages)作为后端编程语言,并且归类于其他类别,可能意味着它不局限于某一特定功能或领域。 ### 压缩包文件名称列表知识点: 1. **www.codejia.com:** - 这个文件名可能指示了程序被托管或下载的来源网站,也暗示了可能含有与网站域名相关的程序文件。 ### 综合知识点: 1. **软件开发与维护:** - 从描述中可以看出开发者在推动软件的持续改进,并鼓励用户参与软件的测试和反馈过程。 2. **软件环境配置:** - 软件对运行环境有所要求,特别是服务器端的支持,需要了解FSO、数据采集、JMAIL等组件的使用和配置。 3. **后台管理系统:** - 更新内容中提及的后台管理功能,如会员管理、公告管理、文章管理等,显示了该程序提供了一套用于网站内容和用户管理的后台解决方案。 4. **前台展示优化:** - 对前台页面的优化和增加功能,如会员注册、文章页、下载页和分类栏目的改进,说明了对用户体验的重视。 5. **安全与权限控制:** - 默认用户名和密码的提供,以及后台目录的默认设置,强调了安装过程中应立即更改编译以提高安全性。 6. **静态页面生成:** - 生成静态页面作为必要步骤可能涉及到网站的性能优化和安全措施。 7. **开源与社区支持:** - 由于提及了更新的可能和用户反馈渠道,这表明软件具有一定的开源特性或至少鼓励社区参与。 综上所述,这些知识点涵盖了软件开发的常见方面,包括软件生命周期的维护、功能更新、环境配置、安全实践以及优化用户体验。了解和掌握这些知识点可以帮助开发者和用户更好地利用和改进免费时代WEB程序INFO2007 V1.0。
recommend-type

Rust测试实战:错误处理、环境变量与模拟服务器

### Rust 测试实战:错误处理、环境变量与模拟服务器 在 Rust 开发中,测试是确保代码质量和稳定性的重要环节。本文将深入探讨 Rust 中的测试技巧,包括错误处理、使用环境变量测试 Config 模块以及使用模拟服务器测试 profanity 模块。 #### 1. 错误处理与比较 在 Rust 中,我们可以为自定义错误类型实现 `std::fmt::Display` 特征,以便将错误转换为字符串。以下是一个示例: ```rust impl std::fmt::Display for Error { fn fmt(&self, f: &mut std::fmt::For
recommend-type

请分析下面代码:<tbody> <#if (paginationSupport.items)?has_content> <#list paginationSupport.items?sort_by('caseNo') as s> <tr class="b"> <td><a href="../user/viewRequestForm.action?requestFormId=${s.id}">${s.caseNo?default("Not Assigned")?if_exists}</a></td> <td>${s.lotId?if_exists}</td> <td><@m.directoryLink s.applicant?if_exists /></td> <td>${s.prodId?if_exists}</td> <td>${s.lotStageId?if_exists}</td> <td>${s.status?if_exists}</td> <td> <#if s.status!="Waiting For STR"> <#if s.workflowId?exists> <#list s.queuedOwners as owner> <#if owner?matches("[MmAaEeTt]\\d{3}.*")> <@m.directoryLink owner/> <#elseif owner?matches("[K-Z][A-Z][A-Z].*[_].*")> <#list adminService.loadGroupMembersByName(owner) as member> <@m.directoryLink member/><!--by Group--> </#list> <#else> <@m.orgManager owner?if_exists/><!--by Org--> </#if> </#list> </#if> <#else> <#if s.ercCategory=="Input the STR Number"||s.ercCategory=="STR"||s.ercCategory=="MSTR"> STR NO:<a href="${ercService.strLink?if_exists}${s.strEnNo?if_exists}" target="_blank">${s.strEnNo?if_exists}</a> is not effective <#else> EN NO:<a href="${ercService.enLink?if_exists}${s.strEnNo?if_exists}" target="_blank">${s.strEnNo?if_exists}</a> is not effective </#if> </#if> </td> <td><#if s.submitDate?exists>${s.submitDate?datetime?if_exists}</#if></td> <td>${s.purpose?default('')}</td> </tr> </#list> </#if> </tbody>

这段代码是使用 FreeMarker 模板引擎生成 HTML 表格内容的一部分,主要功能是根据分页数据展示请求表单的信息。以下是代码的详细分析: --- ### 1. **条件判断与循环** ```html <#if (paginationSupport.items)?has_content> ``` 判断 `paginationSupport.items` 是否存在且非空,只有存在数据时才执行表格渲染。 ```html <#list paginationSupport.items?sort_by('caseNo') as s> ``` 对 `paginationSupport.item
recommend-type

op-drone:监控未平仓头寸的市场利器

标题中提到的“op-drone”很可能是指一个特定的监控系统或服务的名称,它被用来“持续监控市场中的未平仓头寸”。未平仓头寸是指在金融市场上尚未完成交易结算的买卖双方的持仓数量。监控未平仓头寸对于市场参与者来说至关重要,因为它可以提供有关市场流动性和投资者情绪的重要信息。 在深入探讨之前,需要了解几个基础概念: 1. 未平仓头寸:指交易者在期货、期权、外汇或其他衍生品市场上建立的但尚未平仓的头寸。这些头寸在到期前仍然具有价值,而且市场上的价格变动会对它们的总体价值产生影响。 2. 持续监控:这通常是指使用软件工具或服务不断跟踪和分析市场数据的过程。持续监控可帮助交易者或市场分析师及时捕捉市场的动态变化,并根据最新情况做出交易决策。 3. 市场监控系统:这类系统通常具备收集实时数据、分析市场趋势、识别异常交易行为等多种功能。它们对于投资者了解市场状况、进行风险管理以及制定交易策略至关重要。 从描述中可以推断出,op-drone是一个专门用于持续监控未平仓头寸的系统或服务。这种系统需要具备以下功能: 1. 数据收集:系统需要有能力实时收集金融市场中的数据,包括但不限于期货、期权、股票、债券等金融产品的交易信息。 2. 数据分析:通过算法或机器学习技术分析收集到的数据,识别市场趋势、投资者行为模式以及潜在风险。 3. 异常检测:能够识别出市场中的异常交易活动,比如未平仓头寸的急剧变化,这可能是市场重大变动的前兆。 4. 风险预警:系统应能向用户发出风险预警,告知用户潜在的市场风险,帮助他们进行风险管理。 5. 报告与可视化:提供详细的数据报告和可视化图表,帮助用户更直观地理解市场状况和未平仓头寸变化。 此外,虽然文件中未提供标签和具体的文件名称列表,但可以推测“op-drone-main”可能是系统中的一个核心组件或主程序的名称。这个组件可能是整个op-drone系统运行的基础,负责处理大部分的监控和分析功能。 综合以上信息,我们可以得出一个结论:op-drone是一个专门设计用于监控金融市场上未平仓头寸的系统或服务。它可能具备实时数据收集和分析、异常行为识别、风险预警以及报告和可视化展示等多种功能,从而帮助用户在复杂的市场环境中做出更加明智的决策。对于需要精确把握市场动态、进行风险管理的金融分析师、交易员、投资组合经理等专业人士来说,这样的系统是不可或缺的工具。
recommend-type

RustWeb服务部署与环境变量配置全解析

### Rust Web 服务部署与环境变量配置全解析 在 Rust 开发中,完成业务逻辑编写后,将应用部署到生产环境是关键的下一步。本文将深入探讨 Rust 应用部署过程中的重要环节,包括环境变量的配置、二进制文件的优化以及跨平台编译等内容。 #### 1. 认证与授权相关未覆盖内容 在认证和授权方面,有一些内容未详细涉及。例如,设置会话数据库来存储令牌,以便在数据泄露或用户有其他需求时使令牌失效。可以通过设置 Redis 实例,在生成每个令牌时,不仅将结果返回给客户端,还将其存储在 Redis 键值存储中。 另外,重置用户密码和创建刷新令牌也是重要的话题。重置用户密码可以通过创建一个
recommend-type

消灭病毒 源代码

要查找消灭病毒游戏的源代码,可通过以下几种常见途径获取: ### 开源代码平台 - **GitHub**:作为全球最大的开源代码托管平台,有开发者会将自己开发的消灭病毒游戏源代码分享到上面。在GitHub的搜索框输入“消灭病毒游戏”相关关键词,如“Virus Elimination Game” 、“消灭病毒 Unity”等,就能筛选出相关的代码仓库。有些仓库可能是完整的项目,包含游戏开发所需的全部代码和资源;有些则可能是部分功能的实现,需要进一步整合。 - **Gitee**:国内的开源代码托管平台,很多国内开发者会将自己的项目上传至此。同样使用相关关键词搜索,或许能找到符合需求的消灭病毒游
recommend-type

Apache Directory:Java编写的LDAP v3兼容目录解决方案

标题中所提及的“directory”一词在IT领域有多种含义,而描述中提供了具体的上下文信息,即Apache Directory项目。这个项目是Apache软件基金会下的一个子项目,它提供了使用Java语言开发的开源目录服务解决方案。下面详细说明Apache Directory项目中涉及的知识点。 **Apache Directory项目知识点** 1. **目录服务(Directory Service)** - 目录服务是一种特殊类型的数据库,它主要用于存储关于网络中的对象信息,如用户、组、设备等,并使得这些信息可以被集中管理和查询。与传统的关系数据库不同,目录服务通常是为了读操作比写操作更频繁的应用场景优化的,这使得它特别适合用于存储诸如用户身份验证信息、配置数据、策略信息等。 2. **LDAP(轻量级目录访问协议)** - LDAP是目录服务使用的一种协议标准,它定义了客户端与目录服务进行交互的规则和方法。LDAP v3是LDAP协议的第三个版本,它在功能上比前两个版本更为强大和灵活。LDAP服务器通常被称为目录服务器(Directory Server),用于存储目录信息并提供查询服务。 3. **ApacheDS(Apache Directory Server)** - Apache Directory Server是Apache Directory项目的主要组件之一,是一个完全用Java编写的LDAP v3兼容的目录服务器。它符合LDAP标准的所有基本要求,还提供了丰富的可扩展性,如扩展协议操作、自定义属性类型、自定义操作等。它的设计目标是成为一个轻量级、易于使用且功能强大的目录服务器,特别适用于企业环境中的用户身份管理。 4. **认证和授权** - 在一个目录服务环境中,认证是指验证用户身份的过程,而授权是指授予已认证用户访问资源的权限。Apache Directory Server在设计上提供了对这些安全特性的支持,包括但不限于:密码策略、访问控制列表(ACLs)等。 5. **Eclipse和Apache Directory Studio** - Apache Directory Studio是一个基于Eclipse的开源集成开发环境(IDE),它专门为目录服务的开发和管理提供工具。它包含一个LDAP浏览器、一个LDIF编辑器、一个Schema编辑器等工具。开发者和管理员可以利用Apache Directory Studio来浏览和管理LDAP服务器,以及创建和修改LDAP条目和Schema。 6. **LDIF(LDAP数据交换格式)** - LDIF是LDAP数据交换的文件格式,用于在文本文件中表示LDAP目录的信息。它通常用于备份和恢复LDAP数据,以及将数据导入到LDAP目录中。Apache Directory API允许用户操作LDIF文件,为这些操作提供了丰富的接口。 **网络服务器与网络客户端** 网络服务器是位于服务器端的软件,负责处理来自客户端的请求,并将信息回传给客户端。网络客户端则是发起请求的软件,它连接到服务器并获取服务或数据。Apache Directory Server作为网络服务器的一个例子,为客户端提供目录服务的访问能力。这可能包括身份验证服务、数据检索服务等。网络客户端则需要使用适当的协议和API与目录服务器通信,例如使用LDAP协议。 **压缩包子文件的文件名称列表** 提供的文件名称“apache-ldap-api-1.0.3-bin”表明这是一个可执行的二进制包,其中包含了Apache Directory API的版本1.0.3。API通常包含了一系列用于与目录服务进行交互的类和方法。开发者可以使用这些API来编写代码,实现对LDAP服务器的管理操作,如查询、更新、删除和添加目录信息。 总结上述内容,Apache Directory项目是针对提供目录服务解决方案的开源项目,包括了Apache Directory Server作为服务器组件,和Apache Directory Studio作为客户端工具。项目遵守LDAP v3协议标准,并提供易于使用的API接口,使得开发者能够构建和管理一个高效、安全的目录服务环境。在使用过程中,了解LDAP协议、目录服务的安全机制以及相关的API使用是基础知识点。同时,由于Apache Directory项目采用Java语言编写,了解Java编程语言和其生态系统也对开发和部署相关服务有极大的帮助。
recommend-type

Rust项目中用户认证与登录功能的实现与优化

### Rust 项目中用户认证与登录功能的实现与优化 在开发 Web 应用时,用户认证是一个至关重要的环节。它涉及到用户密码的安全存储、账户注册时的重复错误处理以及登录逻辑的实现等多个方面。下面将详细介绍如何在 Rust 项目中实现这些功能。 #### 1. 密码哈希与加盐 为了确保用户密码的安全,我们不能直接存储明文密码。常见的做法是使用哈希算法对密码进行处理。不过,单纯的哈希还不够,因为攻击者可能通过比对已知破解的哈希列表来获取明文密码。因此,我们还需要对密码进行加盐处理,即在哈希之前添加一个随机生成的序列。 我们引入了两个新的 crate 来实现这个功能: - `rand`:用于
recommend-type

如何使用使用QZipReader解压文件

`QZipReader` 是一个方便的工具,用于在 Qt 应用程序中解压 ZIP 压缩包,它提供了读取 ZIP 文件的接口,并能提取其中的内容。以下是使用 `QZipReader` 解压文件的示例代码: ```cpp #include <QZipReader> #include <QFile> #include <QDir> void zip_decompress(const QString &fileName, const QString &path) { if (fileName.isEmpty()) { return; } QFileInfo f