6

这是代码:

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

4

2 回答 2

11

这是意料之中的:std::endl将 a 写入L'\n'宽字符流(并刷新它,但在这里不相关),从不L"\r\n". 写字面量时更明显L"\n"WriteFile不执行任何类型的换行符替换,也没有wstringstream(请注意,文件流在以文本模式打开时执行换行符替换,这就是您在 中获得正确换行符的原因(*1))。因此,文件中不会有回车符。如果你想要它们,请明确地写出来。

于 2012-04-28T12:46:11.323 回答
4

字符串流不进行行尾转换。与(char 或 wchar,取决于上下文)std::endl完全相同。\n

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

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

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

于 2012-04-28T13:01:23.683 回答