首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >wofstream写入不必要的字节。

wofstream写入不必要的字节。
EN

Stack Overflow用户
提问于 2014-05-27 07:47:18
回答 1查看 830关注 0票数 1

到目前为止,我正在尝试使用wofstream在utf-16中进行文件输出。但是我有一个问题,要写一句新的话。正如我在记事本和十六进制编辑器中发现的那样,windows上的新行对应于两个符号: LineFedd和CarrigeReturn (0x000A和0x000D)。试图以编程的方式对此进行斥责,会导致奇怪的结果。

代码语言:javascript
复制
#include <fstream>
#include <codecvt>
#include <locale>
#define ENDL L"\u000a\u000d"
using namespace std;
int main()
{
locale utf16(locale(), new codecvt_utf16<wchar_t, 0x10ffffUL, little_endian>());//for writing UTF-16
wofstream fout(L"text.txt");
fout.imbue(utf16);
const unsigned short BOM= 0xFEFF;
fout.write((wchar_t*)&BOM, 1);
fout<<L"some text"<<ENDL<<L"more text";
fout.close();
}

后面的课文完全搞砸了。我和一个妖术编辑一起找到了原因。对于ENDL,它写0D0A000D00。也就是说,由于某种原因,它在Linefeed字符之前写入不必要的有害的0D字节,从而导致以下所有字节向右移动,从而扰乱utf-16的编码。

我不明白为什么会发生这种事,我怎样才能解决

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-05-27 07:55:38

尝试以二进制模式打开文件:

代码语言:javascript
复制
std::wofstream fout(L"text", std::ios_base::binary);

我没有使用Windows系统的经验,但是操作系统似乎对用行尾序列代替新词毫无帮助。

另外,我首先要对修改后的区域设置和文件进行imbue():一旦读取了一个字符,调用imbue()就没有效果,也没有定义的行为(不要回忆起哪个是临时的)。我认为没有什么可以阻止流读取open()上的第一个缓冲区。不过,我不认为这是你真正的问题。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23883780

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档