wifstream并不能理解UNICODE文本文件

C++与EasyX图形库实现学生信息管理系统:从设计到实践 在软件开发领域,图形用户界面(GUI)与数据管理的结合是构建实用桌面应用的核心。通过面向对象编程(OOP)思想,我们可以将数据模型、业务逻辑与用户界面分离,实现高内聚、低耦合的架构设计。这种分层架构不仅提升了代码的可维护性,也为后续功能扩展奠定了基础。数据持久化作为应用的关键环节,常通过文件操作或数据库实现,其中文本文件读写因其简单直观,成为初学者理解数据存储原理的常见实践。C++作为一门高效的系统级语言,结合EasyX这类轻量级图形库,能够快速实现图形化应用开发,尤其适合课程设计或小型工具开发。本文将围绕 阅读详情

今天在写一个小应用的时候,需要从一个UTF-16的文本文件中读入一个一个的宽字符,想当然的以为wifstream天生就能识别 Unicode,代码如下(utf16.txt是一个用记事本编辑并保存为utf16格式的文本文件)

001    wifstream ifs("utf16.txt");
002 for (;;) {
003 wchar_t wc = ifs.get();
004 if (WEOF==wc)
005 break;
006 else
007 cout << wc << ' ';
008 }
...

结果令人失望,ifs >> wc(或ifs.get(wc))只是把文件中的下一个字节置入wc,表现出来的行为与ifstream没有任何区别…& hellip;啊,忘了,utf16的文本文件前面还有两个字节用来标识字节序(在x86平台下,是FF FE,表示低位在前的UTF16),于是在002行前面再加上一句:

ifs.seekg(2, ios::beg);

嗯,BOM(Byte Order Marker)被跳过了,但是get()方法只读一个字节(用>>提取符也是一样)的行为并没有得到改变。不知道wifstream的策略究竟是怎样的(如果wistringstream来测试,行为完全符合预期),为什么会有这种古怪,时间不早,明天来看相关源码,先用其他方法暂时应付过去:

ifstream ifs("utf16.txt", ios::in | ios::binary);
if (!ifs.is_open())
throw runtime_error("open file failed");
ifs.seekg(2, ios::beg);
while (ifs.good()) {
wchar_t wc;
ifs.read((char *)&wc, sizeof(wc));
if (ifs.eof())
break;
else
cout << wc << ' ';
}
C++ UTF-8文件读写乱码终极解决方案:跨平台编码处理实战 字符编码是计算机科学中处理文本数据的基础概念,它定义了字符与二进制数据之间的映射规则。在跨平台开发中,由于不同操作系统默认使用不同的本地编码(如Windows的GBK与Linux/macOS的UTF-8),当程序未明确指定编码规则时,就会因编码错配导致乱码问题。其技术价值在于确保文本数据在存储、传输和显示过程中的一致性与正确性,这是构建健壮国际化应用的关键。这一原理广泛应用于日志处理、配置文件解析、数据交换等场景。本文聚焦于C++开发中的**UTF-8编码**乱码难题,深入剖析了**std::fstream 阅读详情

相关推荐

硅传CC1310二次开发必备:手把手教你用JTAG解锁被锁定的Flash存储器

本文针对硅传CC1310模块二次开发中常见的Flash锁定问题,提供了从原理剖析到实战操作的完整解决方案。详细介绍了如何使用Uniflash和Flash Programmer 2等工具进行Flash解锁和擦除,并强调了硬件连接稳定性与供电质量的关键作用,帮助开发者彻底解决烧录障碍,为后续应用开发铺平道路。

weixin_29189373的博客 254

C++读取中文文本文件乱码问题:从编码原理到跨平台解决方案

字符编码是计算机处理文本信息的基础,它定义了字节序列与字符之间的映射规则。其核心原理在于为每个字符分配唯一的数字标识,并通过特定算法进行存储和传输。在C++工程实践中,正确处理字符编码对于确保文本数据的正确读写、显示和交换至关重要,尤其是在处理多语言和跨平台应用时。当文件存储编码与程序解释编码不一致时,就会出现乱码问题,这直接影响到文本分析工具、游戏本地化、日志处理等场景的数据可靠性。本文聚焦C++文件操作中的经典乱码难题,深入剖析std::ifstream与多字节编码(如UTF-8、GBK)冲突的根源,并

weixin_34292402的博客 507

Zigbee开发环境搭建:从驱动安装到程序烧录全指南

本文提供了一份详尽的Zigbee开发环境搭建全指南,涵盖从驱动安装到程序烧录的完整流程。重点介绍了使用SmartRF Flash Programmer和仿真器进行程序下载的关键步骤,并详细说明了USB转串口驱动的配置方法,帮助开发者快速构建稳定的Zigbee开发基础。

weixin_29195217的博客 394

C++读取文件中的汉字,wifstream,wstring的使用

C++使用wifstream读取文件,wstring的使用,opencv的putText函数在图片上写汉字

小孟飞飞的博客 1万+

XDMA 驱动安装与性能测试全流程解析

本文详细解析了XDMA驱动的完整安装与性能测试流程。从环境准备、源码获取、编译安装到驱动加载与设备验证,逐步指导用户打通FPGA加速卡与主机间的高速数据通道。重点介绍了如何通过官方测试脚本进行功能验证与带宽性能测试,帮助用户评估XDMA驱动的实际传输效能,为AI推理、高频交易等低延迟高带宽应用奠定基础。

weixin_29216049的博客 524

(25.08)Ubuntu20.04+ROS1复现FAST-LIO2

请确保在。

m0_69023437的博客 3992

【蛋疼c++】千万别用std::wifstream读取Unicode UTF16文件

这说明,程序里面 TCHAR* 字符串就是UTF16编码,不需要 std::wifstream 多此一举地解码,直接读取到内存即可。一些特殊表情符号直接空白(比如:🍓)。或许是,这个办法不支持UTF16的surrogate pair,四个字节的符号。ActiveX这玩意,导出文件,如果是UTF8导出,会出现莫名异常:写一半直接退出。在C++程序中,UTF8文件直接用 stf::ifstream 读进来就可以。

sinat_27171121的博客 839

【笔记篇】Davinci Configurator OS模块(上)

主要讲解了AUTOSAR OS配置项和Vector MICROSAR OS的特性

weixin_47571898的博客 2272

(18)用std::wifstream读取Unicode文本

在网上找了一个多小时,终于找到可以读取Unicode版本的代码,网上的资源真的太混乱了,还是google->stack overlow好啊: 记录代码,转载如下: https://stackoverflow.com/questions/26121782/read-unicode-file-with-special-characters-using-stdwifstream 代码如下: #in

I feel lost 5470

SAP 行业扫盲系列之一:SAP 从业者的分类

本文简单介绍了 SAP 从业者的分类,限于笔者狭隘的视角,可能存在遗漏或者不恰当的地方,希望大家在评论区指出。 那些在知乎咨询上向我提问关于进入 SAP 行业建议的朋友们,也请大家提问时注明自己想具体从事 SAP 行业哪一类的工作,这样才能得到更让你们满意的回复。感谢阅读。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 1589

infercnv的实操

摘要: 博主在infercnv分析中遇到执行困难,外包服务不可靠(未按要求使用HMM方法)。通过优化策略(逐样本处理、精简细胞至1000个、固定随机种子)解决了运行问题,但HMM功能仍无法实现。最终参考Cell期刊标准设置阈值完成分析,后续将继续更新进展。该案例凸显了生物信息分析中自主优化的重要性。(150字)

xiaoyusang的博客 308

C++ 小白 学习记录8

第八章 IO类 iostream 流操作 istream, wistream ostream, wostream iostream, wiostream fstream 文件流操作 ifstream, wifstream ofstream, wofstream fstream, wfstream sstream string 流操作 istringstream, wistringstream ostringstream, wostringstream stringstream, wst

yutao1131的博客 356

QT 实现QStackedWidget切换页面右移动画

首先截取当前界面的图片,渲染到一个QLabel上,然后设置QPropertyAnimation动画,动画的作用对象就是这个QLabel,不断的改变geometry;当动画结束的时候,隐藏并释放这个QLabel。以下是一个QStackedWidget,放了两个QPushButton在上面,点击切换不同的界面。为了方便查看动画特效,设置了每个界面的背景图片。

希望能帮助大家,希望大家多多支持,你们的支持是我前进的动力。 882

c++ std::ifstream

#include &lt;iostream&gt; #include &lt;plug/plug.h&gt; using namespace std; //使用宽字符,我猜是为了适应那些要使用宽字符的国家 int main() { auto path = Plug::GetCurrentPath();//返回std::wstring宽字符 std::wstring...

weixin_34232617的博客 606

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

C/C++文件读写常用API

C/C++文件读写常用API

younggung的博客 928

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

[原创]C++, 利用std::wifstream和std::getline方式对目标字符串进行拆分

[简介] 常用网名: 猪头三 出生日期: 1981.XX.XX 个人网站: https://www.x86asm.org QQ交流: 643439947 编程生涯: 2001年~至今[共18年] 职业生涯: 16年 开发语言: C/C++、80x86ASM、PHP、Perl、Objective-C、Object Pascal、C#、Python、JavaScript 开发工具: Visual St...

其实我不是代码教父,我只是猪头三 2304

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

中文路径

混合编码编译选项不能读中文路径需要设置为unicode编译选项 wifstream ifs;ifs.read(参数1,参数2)参数2传的是个数,跟Unnicode无关 将参数1转化成ansic过后得到的string.size()跟参数2不一样。所以取读取的长度还是用参数2 PS:string.size()跟string.length()都是得到的字节数

随心散人专栏 800

fstream库:与文件共舞,为数据编写华尔兹

在C++中,对文件的写入操作可以使用标准库中的fstream库。fstream库提供了用于文件输入/输出的类,包括ifstream(用于文件输入)、ofstream(用于文件输出)和fstream(用于同时进行文件输入和输出)。1.ifstream:用于文输入件流。适用场合:当你需要从文件中取出数据(类)时。示例代码// 打开文件 example.txtif (!inputFile) { // 检查文件是否成功打开。

m0_74311333的博客 1634

C++ ofstream和ifstream详细用法

[导读] ofstream是从内存到硬盘,ifstream是从硬盘到内存,其实所谓的流缓冲就是内存空间 在C++中,有一个stream这个类,所有的I/O都以这个“流”类为基础的,包括我们要认识的文件I/O. stream这个类有两个重要的运算符: 1 1、插入器(<<) 向流输出数据。比如说系统有一个默认的标准输出流(cout),一般情况下就是指的显示器,所以,cou...

u010559586的博客 599

C++之std::forward(完美转发)

std::forward是C++11引入的函数模板,它的作用是实现函数参数的完美转发,通俗的讲就是根据传入的参数,决定将参数以左值引用还是右值引用的方式进行转发。//左值版本//右值版本。

红军不怕远征难,万水千山只等闲 1万+

c++ IO库之ifstream的一些基本操作

       c++ IO库中关于文件的的流有六个,它们是ifstream wifstream ofstream wofstream fsream wfsream。w开始的是针对wchar_t类型的数据。从左到右分为三组,它们作用分别是:从文件读取数据、向文件写入数据、读写文件。它们包含在fstream头文件中最近在项目中用到了ifstream,现在对其进行简要说明。               ...

ypy9323的博客 4046

C++ IO类

IO库类型和头文件//头文件和类型 //流 #include <iostream> istream , wistream //从流中读取数据 ostream , wostream //向流中写入数据 iostream , wiostream //读写流//文件 #include <fstream> ifstream , wifstream //从文件读取数据 ofst

cape的博客 622

现代 C++ 编程秘籍(五)

C++标准库最重要的部分之一是基于输入/输出(I/O)流库,它使开发者能够处理文件、内存流或其他类型的 I/O 设备。本章的第一部分提供了对一些常见流操作(如读取和写入数据、区域设置和操作流的输入和输出)的解决方案。本章的第二部分探讨了 C++17 的库,它使开发者能够对文件系统及其对象(如文件和目录)执行操作。本章涵盖的食谱如下:从/向二进制文件读取和写入原始数据从/向二进制文件读取和写入对象在固定大小的外部缓冲区上使用流使用区域设置流使用 I/O 操作符控制流的输出使用货币 I/O 操作符使用时间 I/

龙哥盟 398

C++读写unicode文本

熟悉一下字符类型,char, wchar_t, TCHAR,最熟悉的char是单字节字符,适用于ANSI编码;wchar_t是双字节的宽字符类型,适用于unicode编码;TCHAR是一个宏,在ANSI坏境下定义为char,unicode坏境下定义为wchar_t。 怎么来表示字符串?对,字符数组,要知道在C++语言里面,其实没有数组的数据结构,所谓数组,都是由指针+长度来表示。字符型指针c

1000
上一篇: 为一个朋友的代码进行纠错
下一篇: 99.999%的程序员都绝对实现不了的……
SeaWave
博客等级 码龄27年 117粉丝 126原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值