wofstream写入不必要的字节

时间:2014-05-27 07:47:18

标签: visual-c++ utf-16 wofstream

到目前为止,我正在使用wofstream在utf-16中尝试使用文件输出。但是我写一个新行有一个问题。当我发现记事本和十六进制编辑器时,Windows上的新行对应于2个符号:LineFedd和CarrigeReturn(0x000A和0x000D)。试图以编程方式重新编译这导致了奇怪的结果。

#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之后的文字完全搞砸了。我用十六进制编辑器找到了原因。 对于ENDL,它写入0D 0A 00 0D 00。也就是说,由于某种原因,它在换行符之前写入了不必要的和有害的0D字节,导致所有后续字节向右移动,从而混淆了utf-16编码。

我不明白为什么会发生这种情况,我该如何解决?

1 个答案:

答案 0 :(得分:1)

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

std::wofstream fout(L"text", std::ios_base::binary);

我没有Windows系统的经验,但似乎操作系统无法用行尾序列替换newlunes。

此外,我首先imbue()修改后的区域设置和open()文件:一旦读取了一个字符,调用imbue()就没有效果或未定义的行为(不要#39;记得哪个副手)。我认为没有什么能阻止流在open()上读取第一个缓冲区。但是,Idon并不认为这是你的实际问题。