MFC中利用CFileDialog选择文件并读取文件所遇到的问题和解决方法
在用MFC编写一个上位机时,需要实现选择和读取一个二进制文件,本来以为很简单的但是在实现过程中遇到很多问题,所幸都一一解决,这里做一下记录。
首先在实现文件选择,在界面上设置一个按钮,并在点击事件函数中输入以下:
1 void CWeatherStationDlg::OnBnClickedButton6()//选择文件 2 { 3 // TODO: 在此添加控件通知处理程序代码 4 m_strHistoryPath = "";//文件选择清空 5 CFileDialog dlg(TRUE,_T("txt"),NULL,OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,_T("文本文件|*.txt||")); 6 if (dlg.DoModal()==IDOK) 7 { 8 m_strHistoryPath = dlg.GetPathName(); 9 if (m_strHistoryPath == "") 10 { 11 MessageBox(_T("未选择文件!")); 12 return; 13 } 14 } 15 ((CEdit*)GetDlgItem(IDC_EDIT5))->SetWindowText(m_strHistoryPath); 16 17 }
然后实现了文件选择,此时文件路径保存在 CString m_strHistoryPath中。然后需要打开改文件,这里采用了fopen打开,需要将CString 格式转为char *格式,先采用强制类型转换:
FILE *fReadHistory = NULL;char *cReadHis;cReadHis=(char*)malloc(200*sizeof(char)); cReadHis= (LPSTR)(LPCTSTR)m_strHistoryPath; fReadHistory = fopen(cReadHis, "rb");fread(strStarLine,1,1,fReadHistory);
此时fread中始终没有数据读入,后来经过查找了解由于当前编译环境为 Unicode,CString 实际上是 CSringW,虽然强转成了 const char *,但你实际发出去的字符串是 "A\0B\0C\0"六个字节。
后来又采用了WideCharToMultiByte();
1 FILE *fReadHistory = NULL; 2 char *cReadHis; 3 cReadHis=(char*)malloc(200*sizeof(char)); 4 memset(cReadHis,0,sizeof(cReadHis)); 5 int n = m_strHistoryPath.GetLength(); //获取宽字节字符的大小,大小是按字节计算的 6 int len = WideCharToMultiByte(CP_ACP,0,m_strHistoryPath,m_strHistoryPath.GetLength(),NULL,0,NULL,NULL); 7 WideCharToMultiByte(CP_ACP,0,m_strHistoryPath,m_strHistoryPath.GetLength(),cReadHis,len,NULL,NULL); 8 cReadHis[len+1]='/0'; //多字节字符以'/0'结束 9 10 fReadHistory = fopen(cReadHis, "rb");
但是此时cReadHis后面存在乱码,导致文件无法打开。
又经过查找文件了解
WideCharToMultiByte(CP_ACP,0,m_strHistoryPath,m_strHistoryPath.GetLength(),cReadHis,len,NULL,NULL);
应改为
WideCharToMultiByte(CP_ACP,0,m_strHistoryPath,m_strHistoryPath.GetLength()+1,cReadHis,len+1,NULL,NULL);
此时路径就正常了,文件也能正常读入。原因暂时还未深究。
此时再补充一点,在程序编写时输入文件读取地址一定不能用单斜杆“\”,需要改为反向单斜杆“/”或双斜杠“\\”,但是用文件选择CFileDialog 读入路径时是不受影响的,内部已经进行过转义。我在这里纠结过很长时间,发现其实不是这里的问题。
转载于:https://www.cnblogs.com/esther711/p/9077315.html
MFC中利用CFileDialog选择文件并读取文件所遇到的问题和解决方法相关推荐
- python文件读取方法read(size)的含义是_在Python中可使用read([size])来读取文件中的数据,如果参数size省略,则读取文件中的()。(4.0分)_学小易找答案...
[单选题]文本文件存储的是(),由若干文本行组成,通常每行以换行符 '\n' 结尾.(4.0分) [单选题]()属性是返回被打开文件的访问模式.(4.0分) [单选题]重力坝是由砼或( )修筑而成的大 ...
- python如何创建文件_python中创建文件、读取文件内容
1.选择文件夹,单击右键,点击New -> Python file 2.命名好之后,如我命的就是创建文件. 3.文件命名好了以后,可以编辑代码 如: nf=open("pi_digit ...
- python文件读取方法read(size)的含义是_在Python中可使用read([size])来读取文件中的数据,如果参数size省略,则读取文件中的()。...
[单选题]李明在他所属的公司工作五年,每天都很认真地处理繁杂的事情,同事们都夸他认真,但是依然没有建树,这是因为: [多选题]品牌标志的作用表现在 [单选题]新产品开发的第一个阶段是_______. ...
- pandas将列表list插入到dataframe的单元格中、pandas使用read_csv函数读取文件并设置保留数值的前置0( leading zeroes)
pandas将列表list插入到dataframe的单元格中.pandas使用read_csv函数读取文件并设置保留数值的前置0( leading zeroes) 目录
- 浏览器中利用js打包下载所有类型文件
浏览器中利用js打包下载所有类型文件 概述 ajax请求方式打包下载所有类型文件 canvas渲染方式打包下载所有图片 相关知识 作者 概述 需求:1.项目中在浏览器中点击按钮后根据多个url地址下载 ...
- python读文件操作-python文件操作读取文件写入文件
读取文件 要使用文本文件中的信息,首先需要将信息读取到内存中.为此,你可以一次性读取文件的全部内容,也可以以每次一行的方式逐步读取. 读取整个文件 要读取文件,需要一个包含几行文本的文件.下面首先来创 ...
- nodejs fs创建文件_节点FS – NodeJS创建文件,读取文件,写入文件
nodejs fs创建文件 Node FS stands for NodeJS File System module. In my previous post, we have already dis ...
- Java File文件流读取文件夹内的文件并替换文件内容
Java File文件流读取文件夹内的文件并替换文件内容 一.前言 二.代码 三.运行结果 一.前言 批量读取文件夹内的文件,并替换各个文件的内容 二.代码 新建一个普通 Java 项目就可以,创建文 ...
- 【shell脚本创建编辑文件,读取文件】
文章目录 一.什么是shell? 二.通过命令创建.编辑.读取文件 1.创建文件 2.编辑文件 3.读取文件 总结 一.什么是shell? Shell 是指一种应用程序,这个应用程序提供了一个界面,用 ...
最新文章
- 【Ubuntu】dpkg: 处理软件包 XXXX (--configure)时出错解决方法
- 计算机无法打开策略,windows电脑本地计算机策略打不开该怎么解决?
- 为何那么多移动互联网APP慢慢失败
- 《微服务架构设计模式》总结,文末送书
- 最全编程语言在线 API 文档
- 如何检查私钥和公钥是否配对_如何检查家具是否有臭虫
- Java BigDecimal toString()方法与示例
- JVM(六)为什么新生代有两个Survivor分区? 1
- 字符串不替代_【数据挖掘】MySQL中的字符串数据类型
- 西北大学集训队选拔赛 F-三生三世(STL set和map的简单应用)
- 陆正耀为瑞幸数据造假道歉:非常自责 会全力挽回损失
- c语言 0x12ed,C语言基本数据类型及运算题库有答案.doc
- java实现Excel数据导出
- paip.java 多线程参数以及返回值Future FutureTask 的使用.
- C++之类和对象(三)
- 一次网易游戏测试(外包)面试
- ppt中插入html格式图表
- qiankun加载react子应用报错[import-html-entry]: error occurs while executing normal script
- 三个学生开发的学术钓鱼软件,成功忽悠了整个学术圈
- 北航计算机控制系统实验报告,北航计算机控制系统实验报告..doc
热门文章
- 卷积神经网络(CNN)的简单实现(MNIST)
- C++读写ini配置文件GetPrivateProfileString()WritePrivateProfileString()
- Linux驱动:TI达芬奇系列kernel中cup类型的判断,以cpu_is_ti81xx()为例
- qcustomplot 游标吸附_qcustomplot游标测量功能--Apple的学习笔记
- mysql 5.6.15_mysql-5.6.15-win32.zip免安装配置
- angular 字符串转换成数字_蓝盟IT外包,Python算法的一般技术和嵌入式库|python|字符串|key|算法|调用...
- WebStorm 运行Rect Native 项目
- java有模糊查询吗,到底Java里的模糊查询语句该怎么写
- usb打印机命令_Hyper-V与你的虚拟机共享设备、USB设备
- 1-Swift中的Struct 和 Class