Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/144.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ endl不';不能使用wstring(unicode)_C++_Windows_Unicode_Newline_Wstring - Fatal编程技术网

C++ endl不';不能使用wstring(unicode)

C++ endl不';不能使用wstring(unicode),c++,windows,unicode,newline,wstring,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

代码如下:

  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);
流f的std::(“file1.txt”);
f这是意料之中的:
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的文件。

2
应该是
sizeof(wchar\u t)
,不是吗?
2
只是为了删节,在原始代码中当然有std::wstring::value\u类型。小心你的术语。Unicode是一种代码点规范。从技术上讲,文件中存储的是Unicode编码。如果您使用的是Windows和wchar\t,这可能是UTF-16,您的意思是它只取“\n”(0x0A)的第一部分,添加零以形成宽字符,将字符放入
wstringstream
并丢弃第二部分(0x0D)?我明白了吗?@fogbit:不,没有任何东西被扔掉。您已经编写了代码,因此它将
L'\n'
写入,因此
wstringstream
L'\n'
写入其内部字符串。不多不少。它不知道你真正的意思是
L”\r\n“
,所以如果你想要它,就告诉它。@fogbit:你说的“普通字符串”是什么意思?我是说
std::string
std::stringstream
。@fogbit:如果你是指你刚才添加的注释掉的片段,那是因为你正在写入以文本模式打开的文件流。转换换行符的是文件流,而不是字符串流。但是普通的字符串流会这样做。我已经更新了代码,如果您愿意,可以试试。转换的是您正在写入的
fstream
,而不是stringstream。