繁体   English   中英

endl不适用于wstring(unicode)

[英]endl doesn't work with wstring (unicode)

这是代码:

  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文本文件中? 谢谢。

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM