endl doesn't work with wstring (unicode)

ⅰ亾dé卋堺 提交于 2019-12-07 08:56:46

问题


Here is the code:

  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);

In the (*1) case there is a newline, in the (*2) and (*3) i see no newline in the file2.txt. In the (*3) there is a newline. I use notepad.exe for browsing. Hex editor shows no 0x0D byte, only 0x0A.

How should i properly put the newline in unicode text file? Thank you.


回答1:


That's expected: std::endl writes a L'\n' to a wide-char stream (and flushes it, but it's not relevant here), never L"\r\n". It's even more obvious when writing a literal L"\n". WriteFile doesn't perform any kind of newline substitution, neither does wstringstream (note that file streams do perform newline substitution when opened in text mode, and that's why you get a proper newline in (*1)). Therefore, in the file there will be no carriage return characters. If you want them, write them explicitely.




回答2:


Stringstreams don't do line-ending conversion. std::endl is exactly the same as \n (char or wchar, depending on context).

CreateFile doesn't do line-ending conversion; it's strictly binary.

So when you create a string with a stringstream and write it to a file with CreateFile, an endl will just be a newline (0x0A) character.

Notepad doesn't cope well with files whose line endings are just newlines instead of CR+LF.



来源:https://stackoverflow.com/questions/10363564/endl-doesnt-work-with-wstring-unicode

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!