我正在尝试序列化一个对象列表。对象本身只包含 CString 成员。对文本文件进行序列化以创建人类可读的日志文件。 问题是为了编写 Unicode 字符串,文件需要具有用于 Unicode 编码的 BOM(字节顺序标记)。
FILE *fStream = NULL;
VERIFY( _tfopen_s( &fStream, _T( "D:\\Test.txt" ), _T( "wt,ccs=UNICODE" ) ) == 0 );
CStdioFile theFile;
theFile.m_pStream = fStream;
CArchive archive( &theFile, CArchive::store );
ListContainingObject.Serialize( archive );
在 Serialize()
中,我尝试写入元素的数量,以便使用列表的大小调用 CArchive::WriteCount()
。
这会弄乱 BOM,如果文件是在记事本中打开的,例如,
-
符号显示在文件的开头。
在 HEX 查看器中,文件头如下所示:ff fe 06 00
。
我知道 06 是我写的列表的容量。我也知道 -
的 ASCII 值可能是 ff fe 06 00
问题是:
有什么方法可以让我在文件的开头写下一个整数,而不用字节顺序标记把它弄乱,这样文本编辑器中就不会显示任何符号了吗?
最佳答案
哦,这一切都将变得一团糟。如果您序列化 CString 对象,它们也会像列表一样写入长度计数。
如果您只有一个字符串列表,则使用 wsprintf() 或 CString::Format() 将计数转换为字符串...将计数写为字符串并以换行符 ("\n").将所有剩余的字符串写成以换行符结尾的字符串。如果您的字符串中有换行符,那么您将不得不以某种方式将其转义。您可以将数据放入某种 XML 格式。您有很多选择。
关于c++ - 在 MFC 中序列化为 Unicode 文本文件 - 错误的文件头,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33654384/