endl不适用于wstring(unicode)

时间:2012-04-28 12:40:50

标签: c++ windows unicode newline wstring

以下是代码:

  std::ofstream f("file1.txt");
  f<<"123"<<std::endl<<"456";           //(*1)

  /*std::stringstream ordinary_strstream; This works too
  ordinary_strstream<<"123"<<'\n'<<"456";
  f<<ordinary_strstream.str();*/

  std::wstringstream s;
  s<<L"123"<<std::endl<<L"456";         //(*2)
  s<<L"123"<<L"\n"<<L"456";             //(*3) 
  s<<"123"<<WCHAR(13)<<WCHAR(10)<<"456";//(*4)

  HANDLE h =CreateFileW(L"file2.txt", GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE,
    NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);

  ULONG l;
  WriteFile(h, s.str().c_str(), s.str().length() * 2, &l, NULL);

在(* 1)情况下有一个换行符,在(* 2)和(* 3)中我看不到file2.txt中的换行符。在(* 3)中有换行符。我使用notepad.exe进行浏览。十六进制编辑器不显示0x0D个字节,仅显示0x0A

我应该如何正确地将换行符放在unicode文本文件中?谢谢。

2 个答案:

答案 0 :(得分:10)

这是预期的:std::endlL'\n'写入宽字符流(并刷新它,但这里不相关),永远不会L"\r\n"。写文字L"\n"时更为明显。 WriteFile不执行任何类型的换行,wstringstream也不执行(请注意文件流执行在文本模式下打开时执行换行替换,这就是为什么你得到一个(*1))中的正确换行符。因此,在文件中将没有回车符。如果你想要它们,请明确地写下它们。

答案 1 :(得分:3)

Stringstreams不进行行结束转换。 std::endl\n完全相同(char或wchar,具体取决于上下文)。

CreateFile不进行换行转换;它是严格的二进制。

因此,当您使用字符串流创建字符串并将其写入CreateFile的文件时,endl将只是换行符(0x0A)。

记事本不能很好地处理行结尾只是换行而不是CR + LF的文件。