在用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选择文件并读取文件所遇到的问题和解决方法相关推荐

  1. python文件读取方法read(size)的含义是_在Python中可使用read([size])来读取文件中的数据,如果参数size省略,则读取文件中的()。(4.0分)_学小易找答案...

    [单选题]文本文件存储的是(),由若干文本行组成,通常每行以换行符 '\n' 结尾.(4.0分) [单选题]()属性是返回被打开文件的访问模式.(4.0分) [单选题]重力坝是由砼或( )修筑而成的大 ...

  2. python如何创建文件_python中创建文件、读取文件内容

    1.选择文件夹,单击右键,点击New -> Python file 2.命名好之后,如我命的就是创建文件. 3.文件命名好了以后,可以编辑代码 如: nf=open("pi_digit ...

  3. python文件读取方法read(size)的含义是_在Python中可使用read([size])来读取文件中的数据,如果参数size省略,则读取文件中的()。...

    [单选题]李明在他所属的公司工作五年,每天都很认真地处理繁杂的事情,同事们都夸他认真,但是依然没有建树,这是因为: [多选题]品牌标志的作用表现在 [单选题]新产品开发的第一个阶段是_______. ...

  4. pandas将列表list插入到dataframe的单元格中、pandas使用read_csv函数读取文件并设置保留数值的前置0( leading zeroes)

    pandas将列表list插入到dataframe的单元格中.pandas使用read_csv函数读取文件并设置保留数值的前置0( leading zeroes) 目录

  5. 浏览器中利用js打包下载所有类型文件

    浏览器中利用js打包下载所有类型文件 概述 ajax请求方式打包下载所有类型文件 canvas渲染方式打包下载所有图片 相关知识 作者 概述 需求:1.项目中在浏览器中点击按钮后根据多个url地址下载 ...

  6. python读文件操作-python文件操作读取文件写入文件

    读取文件 要使用文本文件中的信息,首先需要将信息读取到内存中.为此,你可以一次性读取文件的全部内容,也可以以每次一行的方式逐步读取. 读取整个文件 要读取文件,需要一个包含几行文本的文件.下面首先来创 ...

  7. nodejs fs创建文件_节点FS – NodeJS创建文件,读取文件,写入文件

    nodejs fs创建文件 Node FS stands for NodeJS File System module. In my previous post, we have already dis ...

  8. Java File文件流读取文件夹内的文件并替换文件内容

    Java File文件流读取文件夹内的文件并替换文件内容 一.前言 二.代码 三.运行结果 一.前言 批量读取文件夹内的文件,并替换各个文件的内容 二.代码 新建一个普通 Java 项目就可以,创建文 ...

  9. 【shell脚本创建编辑文件,读取文件】

    文章目录 一.什么是shell? 二.通过命令创建.编辑.读取文件 1.创建文件 2.编辑文件 3.读取文件 总结 一.什么是shell? Shell 是指一种应用程序,这个应用程序提供了一个界面,用 ...

最新文章

  1. 【Ubuntu】dpkg: 处理软件包 XXXX (--configure)时出错解决方法
  2. 计算机无法打开策略,windows电脑本地计算机策略打不开该怎么解决?
  3. 为何那么多移动互联网APP慢慢失败
  4. 《微服务架构设计模式》总结,文末送书
  5. 最全编程语言在线 API 文档
  6. 如何检查私钥和公钥是否配对_如何检查家具是否有臭虫
  7. Java BigDecimal toString()方法与示例
  8. JVM(六)为什么新生代有两个Survivor分区? 1
  9. 字符串不替代_【数据挖掘】MySQL中的字符串数据类型
  10. 西北大学集训队选拔赛 F-三生三世(STL set和map的简单应用)
  11. 陆正耀为瑞幸数据造假道歉:非常自责 会全力挽回损失
  12. c语言 0x12ed,C语言基本数据类型及运算题库有答案.doc
  13. java实现Excel数据导出
  14. paip.java 多线程参数以及返回值Future FutureTask 的使用.
  15. C++之类和对象(三)
  16. 一次网易游戏测试(外包)面试
  17. ppt中插入html格式图表
  18. qiankun加载react子应用报错[import-html-entry]: error occurs while executing normal script
  19. 三个学生开发的学术钓鱼软件,成功忽悠了整个学术圈
  20. 北航计算机控制系统实验报告,北航计算机控制系统实验报告..doc

热门文章

  1. 卷积神经网络(CNN)的简单实现(MNIST)
  2. C++读写ini配置文件GetPrivateProfileString()WritePrivateProfileString()
  3. Linux驱动:TI达芬奇系列kernel中cup类型的判断,以cpu_is_ti81xx()为例
  4. qcustomplot 游标吸附_qcustomplot游标测量功能--Apple的学习笔记
  5. mysql 5.6.15_mysql-5.6.15-win32.zip免安装配置
  6. angular 字符串转换成数字_蓝盟IT外包,Python算法的一般技术和嵌入式库|python|字符串|key|算法|调用...
  7. WebStorm 运行Rect Native 项目
  8. java有模糊查询吗,到底Java里的模糊查询语句该怎么写
  9. usb打印机命令_Hyper-V与你的虚拟机共享设备、USB设备
  10. 1-Swift中的Struct 和 Class