C++ 序列化为MFC中的Unicode文本文件-文件头错误

C++ 序列化为MFC中的Unicode文本文件-文件头错误,c++,serialization,unicode,mfc,byte-order-mark,C++,Serialization,Unicode,Mfc,Byte Order Mark,我正在尝试序列化对象列表。对象本身只包含CString成员。序列化是对文本文件执行的,以便创建人类可读的日志文件。 问题在于,为了写入Unicode字符串,文件需要具有用于Unicode编码的BOM(字节顺序标记) FILE *fStream = NULL; VERIFY( _tfopen_s( &fStream, _T( "D:\\Test.txt" ), _T( "wt,ccs=UNICODE" ) ) == 0 ); CStdioFile theFile; theFile.m

我正在尝试序列化对象列表。对象本身只包含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 viewer中,文件头如下所示:
ff fe 06 00
。 我知道06是我所写列表的容量。我还知道
-
可能具有
ff fe 06 00
的ASCII值。问题是:


有没有什么方法可以让我把一个整数写到文件的开头,而不把它和字节顺序标记弄乱,这样文本编辑器中就不会显示任何符号

噢,一切都会搞砸的。如果序列化CString对象,它们也会像列表一样写入长度计数


如果您只有一个字符串列表,则使用w wsprintf()或CString::Format()将计数转换为字符串。。。将计数写入字符串并以换行符(“\n”)终止。将所有剩余字符串写入以换行符结尾的字符串。如果字符串中有换行符,那么,您将不得不以某种方式逃避它。您可以将数据放在某种XML格式中。您有很多选择。

我正在考虑一种解决方法,在文件的开头写一个字符串,其中将包含列表计数,例如
ListCapacity:50
,在加载时我解析整数,但我想看看是否还有另一个“清理器”根据您在对象/记录/字符串之间使用的分隔符,可能根本不需要写入计数。每次遇到分隔符时,将对象附加到列表的末尾,并开始处理下一个新对象/记录/字符串。
ff fe
是UTF-16 BOM<代码>-具有ASCII值
2d
。如果您想(ab)使用a来存储人类可读的文本,您必须首先将所有内容转换为文本,然后调用
操作符