用ifstream读UTF8格式文件的时候遇到了问题,求解

作者:超级管理员 更新时间:2017-09-13 15:56:57 来源:未知 点击:15642
我要读一个xml文件,是utf8无BOM格式的方法是先ifstream打开文件用seekg,tellg获得长度然后构建了一个std::vector,resize到文件长度+1然后用ifst
我要读一个xml文件,是utf8无BOM格式的
方法是先ifstream打开文件用seekg,tellg获得长度
然后构建了一个std::vector<char>,resize到文件长度+1
然后用ifstream的read读取到vector里


我原本文本最后一行是</datasources>
现在在读取的时候发现有问题,就是每有一个换行会多一个char的长度出来
我看了下读到的vector内容,发现换行位置没有\r只有\n,认为是这个影响长度的判断了
而且读出来的vector虽然最后多点长度出来,但是都是\0,
就是类似“...</datasources>\0\0\0\0\0\0\0”,不影响我后续对文本的处理所以也没在意


但是后来随着我更改了读取的文件内容后,发现读取开始有问题了
就是当文本的行数到一定数量后,原本会是\0的部分读取出了重复数据
,结果行数到七八行后,多出来的char长度不是\0了
结尾变成了"...</datasources>asources>\0"
等于多出的长度读出了重复的数据,随着长度加长继续往前读到换行位置还读出了\r
结果我在后续处理文本的时候就报错了
而且比较奇怪的是我在VS2015上编辑的同样代码读换行较多的文件最后也还是\0结尾的
但是我这次下的是QT的MingW版本,就出现了这个问题


有没有大佬知道这是什么问题,应该怎么处理?麻烦告诉下吧,谢谢了。

找到了临时解决的办法,用二进制格式打开文本的话,读取出来的vector会带\r
这样长度就不会过长导致有多余的字符了,可是还是比较疑惑为啥用文本格式读会出现重复的数据
如果这是我没有正确使用ifstream导致的
那ifstream自己的应对这种问题的方法有没有比较权威的处理方法?

乍看起来c++的cin、cout、ifstream、ofstream、istringstream、ostringstream在输入、输出上比c的scanf、printf、fscanf、fprintf、fread、fwrite、sscanf、sprintf简单,不用格式控制符!
但是不用格式控制符,输入输出恰好是你期望的格式的时候好说;等到输入输出不是你期望的格式的时候,你就会觉得还是用格式控制符更方便、更靠谱。
摒弃cin、cout、ifstream、ofstream、istringstream、ostringstream!
使用scanf、printf、fscanf、fprintf、fread、fwrite、sscanf、sprintf。

In Visual C++ 2005, fopen supports Unicode file streams. A flag specifying the desired encoding may be passed to fopen when opening a new file or overwriting an existing file, like this:

fopen("newfile.txt", "rw, ccs=<encoding>");

Allowed values of the encoding include UNICODE, UTF-8, and UTF16-LE. If the file is already in existence and is opened for reading or appending, the Byte Order Mark (BOM) is used to determine the correct encoding. It is not necessary to specify the encoding with a flag. In fact, the flag will be ignored if it conflicts with the type of the file as indicated by the BOM. The flag is only used when no BOM is present or if the file is a new file. The following table summarizes the modes used in for various flags given to fopen and Byte Order Marks used in the file.

Flag
 No BOM (or new file)
 BOM: UTF-8
 BOM: UTF-16
 
UNICODE
 ANSI
 UTF-8
 UTF-16LE
 
UTF-8
 UTF-8
 UTF-8
 UTF-16LE
 
UTF-16LE
 UTF-16LE
 UTF-8
 UTF-16LE
 

https://stackoverflow.com/questions/27055771/using-seekg-in-text-mode

找到了这个问题相关的解释,贴在上面了。

推荐阅读

热门内容

神马鬼,一道算是物理题的编程题

原题如下:代码如下:#include

请问一下遍历图像的时候 这种ALU写法为

就是遍历图像的时候, 一次处理2个像素或...

if else 两个语句为什么同时执行了

我的程序里有一个if判断,在dubug下...

求助一个计算问题?

#include in...

请解惑,关于QT用C++写串口通信时的一

我把代码贴出来吧,请帮我看看是哪里出了问...

已添加头文件,但报错找不到标识符

引用错误1error C3861: “r...

错误2365,怎么解决啊,求助

如图这么多短变量名放一块儿,很容易重名的...

感觉现代c++不如d语言

功能都是那些功能,现代c++的实现语法太...

逐行读取文件+并发处理,和先读入整个文件

文本的每一行都是一条记录,程序要求对每条...

C语言新手求助,输出的数字非常大

本帖最后由z4164362于2017-0...

最新内容

用ifstream读UTF8格式文件的时候遇到了问题,求解

我要读一个xml文件,是utf8无BOM格式的方法是先ifstream打开文件用...

c++的并行现在是什么情况

主要是在什么地方用啊,hadoop是java写的,当然现在淘汰了,spark是s...

android studio 前台有个地方不懂

刚开始做安卓, 这个标题栏的问题搞了一天,就是出现不了,网上也没找到例子,哪个大...

浅析基于Selenium和TestNG的自动化测试框架

  导语:  互联网产品迭代迅速,敏捷开发模式逐渐盛行,敏捷开发模式下的敏捷测试...

iphone7plus现在升级了gm版还是会自动注销

快奔溃了,不知道是不是哪个软件不兼容。有哪个老铁知道吗?跪求了!我从来没出现过,...

请问今天更新的新版itunes如何导入铃声?

请问今天更新的新版itunes如何导入铃声?...

升级了gm没震动了

只是响铃的一瞬间轻微震一下该开的都开了啊你们是这样不?郁闷更新时96电,更新完成...

听筒声音特别小,不捂着另一只耳朵都听不到说什么,而听筒声音我已经放到最大了!

求解决方案可能听筒网堵起来了!把听筒那的网子用针扎扎就好了找一个干牙刷狠狠的刷刷...

锋友们,帮忙看看10.2的系统,电量正常嘛?有必要升10.33吗?

谢谢大家了,一定会仔细参考各位锋友的建议的。真心谢过啦!!!顺便问问这个现在能卖...

测试用例设计进阶(下)

  场景分析法设计测试用例—场景分析相关概念  场景  应用软件一般都是用事件触...

测试分布式系统的线性一致性

  正确实现一个分布式系统是非常有挑战的一件事情,因为需要很好的处理并发和失败这...

Android UI测试之Espresso使用

  暑假实习的单位,被分到了一个测试组,因为我是搞android开发的,所以被分...

将爱进行到底 苹果发布会直播果粉占半

    中关村在线消息:昨夜今晨不论科技圈还是朋友圈最火爆的恐怕没什么事儿能与苹...

金立新机来袭 这一点不输苹果iPhone X

    一年一度的“科技春晚”在9月13日凌晨拉开了序幕,苹果一口气为用户带来了...

iPhoneX真有腮红金 不过要等明年一月

    今天凌晨,万众瞩目的苹果iPhone X正式发布了。但与此前的传闻不同的...

苹果iPhoneX方言直播:广东人最爱天津话

    中关村在线消息:昨夜今晨科技圈儿最大的事儿恐怕非苹果新品发布会莫属了。在...

有奖调查:看看多少人想买苹果iPhone X

    苹果公司于西部时间9月12日上午10点(北京时间9月13日凌晨1点)在苹...

iPhone X全球售价对比 在这里买最划算

    几个小时前刚刚发布了iPhone X及iPhone 8手机,我是全程看完...

iPhone X发布会 我们送出了千瓶小茗同学

    中关村在线消息:今天凌晨1点,苹果如期召开2017秋季新品发布会,发布了...

10年前投1万买苹果股票 能赚81部iPhoneX

    苹果股票向来是苹果发布会的方向标,每年每代iPhone的新品发布会结束后...