700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > MFC实战篇——“另存为对话框”和“打开对话框”——读写float型数据——二进制文件中

MFC实战篇——“另存为对话框”和“打开对话框”——读写float型数据——二进制文件中

时间:2019-08-27 10:14:25

相关推荐

MFC实战篇——“另存为对话框”和“打开对话框”——读写float型数据——二进制文件中

文章目录

1. 另存为对话框2. 打开对话框2.1 读取到数组中2.2 读取到Mat中

1. 另存为对话框

MFC弹出保存对话框,将float型Mat数据写入二进制文件:

void CProp1::OnBnClickedButton6(){// TODO: 在此添加控件通知处理程序代码//另存为://默认文件名:KB_Y-M-D_h-m-s.datSYSTEMTIME 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);}

2. 打开对话框

2.1 读取到数组中

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。精度提高了。

如果有人晓得,请讲一下。Σ(っ °Д °;)っ

2.2 读取到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;}Mat M4 = Mat(20, 20, CV_32FC1);float* p = M4.ptr<float>();//写float型数据到MAT中fread(p, sizeof(float), M4.cols*M4.rows, fileKBP);float a = 0;for (size_t i = 0; i < 20; i++){float* p = M4.ptr<float>(i);for (size_t j = 0; j < 20; j++){a =p[j];}}fclose(fileKBP);}

数据0.32变成了0.319999993。精度提高了。

忙,不想深究了,如果有人晓得,请讲一下。Σ(っ °Д °;)っ

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。