ENDL不wstring的工作(UNICODE)(endl doesn't work wit

2019-09-16 20:43发布

下面是代码:

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

Answer 1:

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



Answer 2:

Stringstreams不这样做行结束转换。 std::endl是完全一样\n (char或WCHAR,这取决于上下文)。

CreateFile没有做行结束转换; 这是严格的二进制文件。

所以,当你创建一个字符串用字符串流,并将其写入了文件CreateFile ,一个endl将只是一个换行符( 0x0A )字符。

记事本不处理文件,其行结束只是换行,而不是CR + LF很好应付。



文章来源: endl doesn't work with wstring (unicode)