我刚刚遇到了以下行为:当使用CStdioFile::WriteString
时,它会将n
转换为rn
。在我的代码的早期版本中,我没有注意到这个行为,只是在我将项目转换为Unicode之后。我错过了什么?
我试过这个代码:
CStdioFile file;
CFileException fileException;
file.Open(TEXT("c:\test.txt"), CFile::modeCreate | CFile::modeWrite | CFile::shareExclusive | CFile::typeText, &fileException);
file.WriteString(TEXT("__CRr"));
file.WriteString(TEXT("__LFn"));
file.WriteString(TEXT("CRLFrn"));
file.WriteString(TEXT("____"));
file.Flush();
file.Close();
现在的输出结果是:
__CRr
__LFrn //??
CRLFrrn //??
____
我自己刚刚找到了答案:这是CFile::typeText
的设计行为。
MSDN文档说明:
文本模式为回车-换行对提供了特殊处理。当您将换行字符(0x0A)写入文本模式CStdioFile对象时,字节对(0x0D, 0x0A)被发送到文件。当您读取时,字节对(0x0D, 0x0A)被转换为单个0x0A字节。
所以事实上我将模式从CFile::typeBinary
更改为CFile::typeText
,从而引发另一种行为。对于CFile::typeBinary
,您将不会获得额外的回车