在用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 读入路径时是不受影响的,内部已经进行过转义。我在这里纠结过很长时间,发现其实不是这里的问题。

MFC中利用CFileDialog选择文件并读取文件所遇到的问题和解决方法的更多相关文章

  1. PHP 上传文件和读取文件崎岖路

    今天php上传文件和读取文件没有搞出来,全靠后来大神来帮忙,总结一下:主要涉及到一下几个方面,在ubuntu下mkdir文件夹的时候要注意权限问题,一般情况下php是以一个较低的权限去执行的,所以如果 ...

  2. 【转】c# winform 创建文件,把值写入文件,读取文件里的值,修改文件的值,对文件的创建,写入,修改

    创建文件和读取文件的值 #region 判断文件是否存在,不存在则创建,否则读取值显示到窗体 public FormMain() { InitializeComponent(); //ReadFile ...

  3. 从客户端中检测到有潜在危险的 Request.Form 值的问题的解决方法。

    在controller控制器里面添加[ValidateInput(false)]         [ValidateInput(false)]        public ActionResult m ...

  4. Easyui中使用jquery或js动态添加元素时出现的样式失效的解决方法

    Easyui中使用jquery或js动态添加元素时出现的样式失效的解决方法 2014-03-27 11:44:46|  分类: Easy UI|举报|字号 订阅     可以使用$.parser.pa ...

  5. 解压tar.gz文件报错gzip: stdin: not in gzip format解决方法

    解压tar.gz文件报错gzip: stdin: not in gzip format解决方法 在解压tar.gz文件的时候报错 1 2 3 4 5 [Sun@localhost Downloads] ...

  6. 转:导出csv文件数字会自动变科学计数法的解决方法

    导出csv文件数字会自动变科学计数法的解决方法   其实这个问题跟用什么语言导出csv文件没有关系.Excel显示数字时,如果数字大于12位,它会自动转化为科学计数法:如果数字大于15位,它不仅用于科 ...

  7. 在MVC中利用uploadify插件实现上传文件的功能

    趁着近段的空闲时间,开发任务不是很重,就一直想把以前在仓促时间里所写的多文件上传功能改一下,在网上找了很多例子,觉得uploadify还可以,就想用它来试试.实现自己想要的功能.根据官网的开发文档,同 ...

  8. javaScript中利用ActiveXObject来创建FileSystemObject操作文件

    注:如果用javascript读本地文件,遇到安全问题. 需在浏览器中进行设置,如下:     工具—> Internet选项->安全->自定义级别->启用“没有标识为安全的A ...

  9. MFC中使用post提交form-data上传文件

    已经有将近6年时间没写过MFC了,想想以前我也是写VC++入门程序开发的,那时候写协议栈.搞语音编码.做视频压缩和实时数据传输,相比现在更多偏业务的开发,那时候搞得都是非常技术的东西.眨眼间,MFC已 ...

  10. MFC中利用GDI+进行双缓冲作图的有关设置

    这里只是在遇到实际问题的时候提出的一种解决方法,用以处理闪屏问题. 首先要做的是对GDI的一个设置问题: 在应用程序类中添加一个保护权限数据成员 class C...App: {... private ...

随机推荐

  1. web安全学习笔记(2022/8/26)

    网络安全Web学习笔记 @author: lamaper @email: lamaper@qq.com @blog: lamaper - 博客园 (cnblogs.com) @date: Aug.26 ...

  2. url 编码解码

    from urllib import parse#url编码url = 'http://www.baidu.com?query = python基础教程'url_str = parse.quote_p ...

  3. 5G工业智能网关助力智能制造开辟新赛道

    今年以来,物联网技术加速产业变革,制造业出现了不少新现象.从大规模到个性化.从"渠道为王"到"用户定义".从自有工厂到共享协同,智能化制造在很多地方颠覆了传统模 ...

  4. 推荐ssh工具

    介绍一些我常用的ssh工具 1.Xshell ​ Xshell应该是一款家喻户晓的ssh连接工具,本人有幸也在很长一段时间都在使用Xshell,但是Xshell他是收费的!而且每次关闭后都会有一个提示 ...

  5. k8s Service yaml文件编写

    apiVersion: app/v1 #API的版本号,版本号可以用 kubectl api-versions 查询到 kind: Service #表明资源对象,例如Pod.RC.Service.N ...

  6. es实现规格动态域生成

    1.就是把sepc的可以提取出来作为一个域(sepc是一个规格参数) 封装搜索条件(跟jdbc流程一样) @requestparam( required = false) 的作用?   不传值后台也不 ...

  7. android判断是否连接wifi跟网络状态的判断及wifi信号强度的方法

    场景:android判断是否连接wifi跟网络状态的判断 android判断是否连接wifi和网络状态的判断 // 是否连接WIFI public static boolean isWifiConne ...

  8. py10函数之嵌套-名称空间作用域

    # 函数是第一类对象:函数名指向的值可以被当中参数传递 # 1.函数名可以被传递# name = 'jason'# x = name# print(x)# print(id(x))# def func ...

  9. vue vant3上传图片文件以流的形式上传

    axios.post("/fjt_fast/sys/comm/upload", { file: param.file}, { headers: { 'Content-Type': ...

  10. vscode远程连接服务器出现Bad owner or permissions on .ssh/config

    vscode远程连接服务器出现Bad owner or permissions on C:\\Users\USER\.ssh/config 过程试图写入的管道不存在, 原因是vscode的remoto ...