CStdioFile类打开文件,用TextOut输出时乱码……

MFC用CStdioFile类读取中文文本时乱码问题的一种解决方法 在文章开始之前,先声明一下,本人的编程环境为vs2010,MFC工程使用unicode字符集。         在MFC中,用CStdioFile类可以很方便地一行一行读取文件。 可是最近我在编写MFC程序时,用CStdioFile读取中文文本时,发现读入的是乱码。在网上查了很多方法都得不到很好的解决。后来本人冷静下来仔细分析了一下,找到了一种可行的方法。下面这个框图是我的这种方法的基本思路: 阅读详情

    几天前开始学习VC++(MFC)了,我很是激动,因为以前上课讲了C/C++,但是那都是些基础的运算,还没有真正的涉及到程序设计的实质性东西,现在我终于决定要学习编写一个程序了,我决定写一个小程序,文本阅读器,就像Windows的记事本一样的东西。但是一开始就遇到非常大的问题……我用MFC建立了程序框架,开始写代码,第一个代码,我决定写打开功能,也就是onFileOpen函数,但这个函数整整花了我四天时间……哎,那个累啊……

    好了,罗嗦了一大段,下面说说这个问题。

    在写onFileOpen函数是,在打开文件后,我用了CDC::TextOut函数将其输出到用户区窗口上,但是遇到一个问题,就是在输出中文的时候出现了乱码……于是,我展开了大量搜索,终于把这个问题解决了……

我的源代码如下:

void CTextReadView::OnFileOpen()
{
     // TODO: 在此添加命令处理程序代码
     CString fpathname;
     static TCHAR BASED_CODE szFilter[] = _T("文本文档(*.txt)|*.txt|")
     _T("All Files (*.*)|*.*||");
     CFileDialog  openDlg(TRUE,NULL,NULL,OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,szFilter,NULL,0,TRUE); 
     if(openDlg.DoModal()==IDOK)   
     {
 
          fpathname=openDlg.GetPathName();
          CStdioFile ofile(fpathname,CFile::modeRead);
          CString ofstr;
          
          CClientDC dc(this);
          CFont font;
          font.CreatePointFont(200,_T("宋体"),NULL);
          dc.SelectObject(&font);
          TEXTMETRIC tm;
          dc.GetTextMetrics(&tm);
          CPoint pt;
          pt=0;
          while(ofile.ReadString(ofstr))
          {
               dc.TextOut(pt.x,pt.y,ofstr);
               pt.y=pt.y+tm.tmHeight;
          }
     }
}

如果就这样直接编译运行,在输出是中文会乱码,解决方法如下:

打开项目属性,修改项目属性里面的“字符集”能够解决这个问题呢,但是同时要改“公共语言运行库支持”,否则编译时会报错得……
但是这样仍然只能显示ANSI格式的文本,其他格式的文本都会不同程度的乱码……怎么办了,一位高手提供了一种解决方法,就是把其他的编码格式转化成ANSI格式,那么不就行咯,转化方法参考该大虾的博客:http://www.cppblog.com/greatws/archive/2008/08/31/60546.html。

……所以,哎,我的这个问题总算是解决,感谢优快云的各位大侠们的帮助……再次感谢…………

VC++6.0项目精讲:从Win32到MFC,掌握Windows桌面开发核心 Windows桌面应用程序开发的核心在于理解其底层运行机制,这通常涉及对Windows API的调用、消息循环的处理以及运行时库的依赖。消息循环是Windows程序的心脏,它负责从系统队列中获取并分发用户输入和系统事件,驱动程序运行。动态链接库(DLL)和运行时库(如MSVCRT)的管理则是确保程序可移植性和部署成功的关键技术,它们解决了代码复用和依赖问题,这也是现代应用(如Flutter桌面端)打包时仍需处理VC++库依赖的根本原因。掌握这些原理,对于维护遗留系统或理解现代框架的底层封装都极具价值。本文将 阅读详情

相关推荐

VC6.0+MFC商品采购管理系统开发实战:从数据库设计到业务逻辑实现

面向对象编程(OOP)和数据库操作是软件开发的核心基础。OOP通过类与对象将现实世界实体映射为代码结构,而数据库操作(CRUD)则是数据持久化的关键技术。掌握这两者,对于构建任何企业级应用都至关重要,其技术价值在于能够创建出结构清晰、可维护且数据驱动的软件系统,广泛应用于进销存、ERP、CRM等各类管理软件场景。本文将以一个经典的“商品采购管理系统”为例,具体阐述如何在VC6.0与MFC框架下,运用C++的面向对象特性进行业务建模,并**通过封装数据库访问类**来执行**增删改查(CRUD)** 等核心操作

anjichan4261的博客 406

CStdioFile读写中文乱码

第一种:基于多字节的 char* old_locale = _strdup( setlocale(LC_CTYPE,NULL) ); setlocale( LC_CTYPE, "chs" ); //文件读写操作 setlocale( LC_CTYPE, old_locale ); free( old_locale ); 第二种:基于Uncode的 wchar_t* pOldLocale = ...

youyicc 2109

VC++ 简单的TextOut源码实例

VC++中简单的TextOut输出文本字符的使用实例,新手有兴趣的源码,实现过程:获取窗口设备上下文,然后在窗口客户区域指定位置输出文本。 运行环境:Windows/Visual C/C++

在MFC中用CStdioFile对象输出utf-8和ansi编码的文本

转自:http://blog.youkuaiyun.com/thinkhy/article/details/5740748 下面的代码分别输出UTF-8和ANSI(简体中文Windows上是GBK编码)两种编码的文本文件。 // // 写UTF-8文本 // 下列文件类操作中可能抛出一个CFileException异常 try { CStdioFile hfile( strFileP

记录技术成长之路 5391

【PLC】三菱plc控件安装 component Movedata had the following error ... Error Number:-119

Windows 10 专业版/企业版本版本号:22H2操作系统内部版本:19045.3448。

少莫千华 8002

CATIA CAA开发环境搭建避坑指南:从授权服务到VS配置全流程

本文提供了一份详尽的CATIA CAA开发环境搭建避坑指南,涵盖从授权服务(DSLS)安装、Visual Studio版本匹配与集成配置,到编译调试全流程。重点解析了授权服务无法连接、模块加载失败等典型问题的解决方案,强调版本严格对应与纯英文环境是成功搭建的关键。

redis7keeper的博客 572

CStdioFile.ReadString读取中文产生乱码解决方法

首先需要明确:1、CStdioFile对Unicode的支持不好,最好采用CFile进行读取操作;2、在Unicode环境下ReadString按char读取,并填入Unicode的CString变量中。对于包含中文的ANSI文本,采用File.ReadString读取,如果不进行转换一定会产生乱码。 经过在CSND的一番折腾,找到解决办法如下: void CTestDlg::Re

知行合一 8367

【GNSS/Linux】BKG Ntrip Client (BNC) 的编译与安装

【GNSS/Linux】BKG Ntrip Client (BNC) 的编译与安装 1. BNC软件 1.1 软件介绍 The BKG Ntrip Client (BNC) is an Open Source multi-stream client program designed for a variety of real-time GNSS applications. It was primarily designed for receiving data streams from any Ntrip

小马甲的新马甲 7804

CStdioFile::ReadString(CString str)读ANSI文件的乱码问题

今天在实现提取某ANSI文件内字符信息时发现中文都是乱码,折腾好久,试了数种方法,就以下两种比较简单有效些:(vs2019解决方案属性设置的是Unicode而非多字节) CStdioFile FileRead(LPCTSTR(_T("***")),CFile::modeRead); CString strRead=_T(""); while(FileRead.ReadString(strRead)) { vecFileLines.push_back(strRead); } 1. 用一个csdn

HVACoder 1505

【保姆级教程】基于UNet++&MobileNetv2的语义分割模型从训练到RK3588部署:让边缘AI落地效率提升300%

通过SMP库一键构建encoder_name="mobilenet_v2", # 选择MobileNetv2作为骨干encoder_weights="imagenet", # 加载预训练权重加速收敛in_channels=3, # 输入图像通道数(RGB)classes=29, # Cityscapes数据集类别数activation=None # 输出无激活,便于后续损失计算本教程从“模型设计-训练-转换-边缘部署”全链路拆解了。

m0_71589036的博客 89

LPDDR6 tdbR2dbR_L cross row技术探讨

LPDDR6 tdbR2dbR_L cross row技术探讨

zilan23的博客 47

Windows API 函数

《Windows API函数手册》摘要 本文档是Windows平台开发的权威参考手册,全面收录774个核心API函数,涵盖系统管理、进程线程、窗口消息、文件操作、图形处理等12大功能模块。手册采用结构化编排,主要特点包括: 编码规范 详细区分多字节(char)与宽字符(wchar_t)编码体系 提供LPSTR/LPCWSTR等字符串指针类型的完整解析 说明UTF-8与GBK编码转换的实际应用场景 核心功能模块 窗口创建:完整展示从注册类到消息循环的窗口生命周期 文件操作:覆盖CreateFile/ReadF

gqk01的博客 862

【YOLOv11多模态涨点改进】独家创新首发| TGRS 2026 |引入 CIFusion 通道交互融合模块,通过跨特征交互机制强化目标区域响应,适合多模态融合目标检测,小目标检测高效涨点

🔥本文提出了一种改进YOLOv11多模态目标检测模型的方法,通过引入CIFusion通道交互融合模块来提升RGB与红外特征融合效果。CIF模块采用通道级自适应交互机制,根据全局上下文动态分配不同模态通道的重要性,实现跨模态特征交互与互补信息融合。相比传统拼接或加权融合方式,CIF能够增强目标区域响应,抑制背景噪声,提高小目标和低对比度目标的检测性能。实验表明,该方法在DroneVehicle等数据集上显著提升了检测精度。论文还详细介绍了CIF模块的结构原理、实现代码及模型配置方法。

Ai缝合怪、助力小伙伴高效发论文 186

CStdioFile读的中文是乱码 解决方法

需要包含头文件: #include unicode下请用 C/C++ codechar*old_locale=_strdup( setlocale(LC_CTYPE,NULL) ); setlocale( LC_CTYPE,"chs");//设定中字符处理方式 处理完后 C/C++ codesetlocale( LC_CTYPE, old_locale ); free( old_l

fivedoumi的专栏 1332

173、LLC谐振变换器的PCB设计实战(布线)

LLC谐振变换器PCB设计实战要点 LLC谐振变换器的PCB设计核心在于控制寄生参数,避免高频振铃和EMI问题。功率回路需确保电流路径最短且紧耦合,谐振电容焊盘需加宽以减少发热。驱动走线应独立于功率回路,避免干扰,并合理控制宽度和长度。变压器绕组结构影响共模噪声,建议原边在外层并加屏蔽铜箔。地平面设计需根据功率等级选择整块或分割,大功率下功率地与信号地应单点连接。谐振电流采样推荐四端开尔文电阻以减少电感干扰。散热需优化铜皮和过孔布局,功率器件优先放置顶层。布局应先确定谐振腔,再排布控制电路。经验上需实测寄生

Jack010169的博客 46

精通 Android NDK/JNI:从入门到精通实战与面试精粹

在Android开发中,

郑伟强dev的专栏 144

windows编程------TextOut与TextOutw与TextOutA,基于vs2010

问题源于:计算机图形学实验,p218,《计算机图形学及实用编程技术》李春雨,北航出版社 按书上的代码输入编译失败 错误行如下: pDC->TextOut(rc.right/2-10,10,"X"); 错误类似于这个:  error C2664: “BOOL CDC::TextOutW(int,int,const CString &)”: 不能将参数 3 从“char [8

Life is Float. 4940

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

解决CStdioFile.ReadString读取中文产生乱码问题

mmm1024的专栏 2521

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

lazarus Textout中文字符串乱码

https://wenda.so.com/q/1560151974218812 lazarusTextout中文字符串乱码 5取nmlgb10级分类:编程开发被浏览146次2019.06.10 检举 我用Textout在窗口输出 '你好'系统却显示其它字体,求懂内行的帅哥美女指教一下,这是我的代码 TextOutA(hdcb,100,10...

weixin_30502965的博客 1234

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

TextOutA函数与TextOutW函数

这仍然是在学习字符编码的时候引出来的。 原意是感觉字符编码既然这么普遍地存在,那么操作系统又是如何做的呢?所以想到要调试一下TextOutA函数,看看它输出文本的时候是怎样对付字符编码问题的。最后的结果是: TextOutA实际上是封装了一个另外的函数调用。TextOutA的流程大概是这个样子: BOOL TextOutA(   HDC hdc,           // handle to DC

jcwKyl的专栏 7996

putText输出中文方法

解决putText输出中文乱码的问题

qq_42317817的博客 1560

CStdioFile ReadString 在unicode环境下汉字显示的乱码的问题。

txt文本是unicode编码格式,但ReadString后,显示汉字是乱码的。以下是解决办法。  CString CSetupForm::GetTxtfile(CString txtdir)  //参数为文件路径 {   CStdioFile file; if(file.Open(txtdir,CFile::modeNoTruncate | CFile::modeRead |

4992

CStdioFile ReadString()中文乱码的解决办法

读取中文前设定字符处理方式: char* old_locale = _strdup( setlocale(LC_CTYPE,NULL) );  setlocale( LC_CTYPE, "chs" ); 然后就可以进行: CStdioFile file; file.ReadString(strLine);等操作………… 等结束后。 //处理完后  还原字符处理方式 setl

Fengyq2009的专栏 2397

CFile和CStdioFile的文件读写使用方法

CFile //创建/打开文件 CFile file; file.Open(_T("test.txt"),CFile::modeCreate|CFile::modeNoTruncate|CFile::modeReadWrite); 文件打开模式可组合使用,用“|”隔开,常用的有以下几种: CFile::modeCreate:以新建方式打开,如果文件不存在,新建;如果文件已存在,把该文件长

lyf_1203的专栏 1756

文件操作之CStdioFile 中文 乱码

包含头文件: #include   读文件:   // TODO: Add your control notification handler code here  char* old_locale = _strdup( setlocale(LC_CTYPE,NULL) );   setlocale( LC_CTYPE, "chs" );  CStdioFile file;  

feiyang094的专栏 1459

CRecordset::AddNew()函数

    调用此函数来添加一个新的记录到数据表中,你必须调用成员函数Requery来查看新添加到记录。记录的字段初始值为NULL。为了完成完整的操作,你必须调用Update函数来更新保存你对数据源的改动。    注意:    如果你连续执行批量的记录操作,你不能使用AddNew函数。它将导致失败中断。尽管CRecordset类没有提供一个方法来做批量的记录操作,但是你可以利用ODBC API SQL

芋头CF的专栏 3596
下一篇: 【MFC学习笔记2】MFC中的数据类型,全局变量,全局函数和宏。
芋头CF
博客等级 码龄18年 28粉丝 24原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值