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。