MFC弹出保存对话框,将float型Mat数据写入二进制文件:
void CProp1::OnBnClickedButton6() { // TODO: 在此添加控件通知处理程序代码 //另存为: //默认文件名:KB_Y-M-D_h-m-s.dat SYSTEMTIME str; GetLocalTime(&str); CString fileName; CString head = _T("KB"); CString cs = _T("-"); CString cs1 = _T("_"); CString cs2 = _T(".dat"); //用当前时间创建默认图片名称 fileName.Format(_T("%s%s%2d%s%02d%s%02d%s%02d%s%02d%s%02d%s"), head, cs1, str.wYear, cs, str.wMonth, cs, str.wDay, cs1, str.wHour, cs, str.wMinute, cs, str.wSecond, cs2); BOOL bOpenFileDialog = FALSE; //格式:过滤器描述符(显示作用)+ \0 + 文件扩展名称(过滤作用) //多个扩展名称之间用(;)分隔,两个过滤字符串之间以\0分隔 //最后的过滤器需要以两个\0\0结尾 TCHAR BASED_CODE szFilter[] = _T("二进制文件(*.dat)|*.dat|"); //bOpenFileDialog TRUE则显示打开文件对话框,FALSE则显示保存文件对话框。 //lpszDefExt 指定默认的文件扩展名。 //lpszFileName 指定默认的文件名。 //dwFlags 指明一些特定风格。 //lpszFilter 是最重要的一个参数,它指明可供选择的文件类型和相应的扩展名。 //pParentWnd 为父窗口指针。 CFileDialog fileDlg(bOpenFileDialog, _T("dat"), fileName, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, szFilter, this); CString strFilePath; // 显示保存文件对话框 if (IDOK == fileDlg.DoModal()) { //取文件名全称,包括完整路径。 strFilePath = fileDlg.GetPathName(); } //CString-->const char* const char* fileKB; char temp[100]; ::wsprintfA(temp, "%ls", (LPCTSTR)strFilePath); fileKB = temp; MessageBox(CString(fileKB)); //打开文件 FILE* fileKBP = fopen(fileKB, "w+b"); if (fileKBP == NULL) { CFileException ex; TCHAR szError[1024]; ex.GetErrorMessage(szError, 1024); MessageBox(szError); return; } Mat M4 = Mat(20, 20, CV_32FC1, Scalar::all(0.32)); cout << "M4 = " << endl <<M4 << endl; //写float型数据到二进制文件中 for (size_t i = 0; i < 20; i++) { float* p = M4.ptr<float>(i); fwrite((char*)p, sizeof(float), M4.cols, fileKBP); } fclose(fileKBP); }
MFC弹出打开对话框,将二进制文件写入float型Mat数据中:
void CProp1::OnBnClickedButton6() { // TODO: 在此添加控件通知处理程序代码 /******************************打开对话框*************************************/ CString fileName = L""; BOOL bOpenFileDialog = TRUE; //格式:过滤器描述符(显示作用)+ \0 + 文件扩展名称(过滤作用) //多个扩展名称之间用(;)分隔,两个过滤字符串之间以\0分隔 //最后的过滤器需要以两个\0\0结尾 TCHAR BASED_CODE szFilter[] = _T("二进制文件(*.dat)|*.dat|"); //bOpenFileDialog TRUE则显示打开文件对话框,FALSE则显示保存文件对话框。 //lpszDefExt 指定默认的文件扩展名。 //lpszFileName 指定默认的文件名。 //dwFlags 指明一些特定风格。 //lpszFilter 是最重要的一个参数,它指明可供选择的文件类型和相应的扩展名。 //pParentWnd 为父窗口指针。 CFileDialog fileDlg(bOpenFileDialog, _T("dat"), fileName, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, szFilter, this); CString strFilePath; // 显示打开文件对话框 if (IDOK == fileDlg.DoModal()) { //取文件名全称,包括完整路径。 strFilePath = fileDlg.GetPathName(); } //CString-->const char* const char* fileKB; char temp[100]; ::wsprintfA(temp, "%ls", (LPCTSTR)strFilePath); fileKB = temp; MessageBox(CString(fileKB)); //打开文件 FILE* fileKBP = fopen(fileKB, "rb"); if (fileKBP == NULL) { CFileException ex; TCHAR szError[1024]; ex.GetErrorMessage(szError, 1024); MessageBox(szError); return; } //读float型数据 float buffer[20 * 20]; fread(&buffer, 4, (size_t)(20*20), fileKBP); for (size_t i = 0; i < 400; i++){ float a = buffer[i]; } fclose(fileKBP); }不知道为啥读出来的float型数据0.32变成了0.319999993。精度提高了。
如果有人晓得,请讲一下。Σ(っ °Д °;)っ
数据0.32变成了0.319999993。精度提高了。
忙,不想深究了,如果有人晓得,请讲一下。Σ(っ °Д °;)っ
