这个问题可能看起来有点过于具体,但我想我会在这里试一试,因为我在过去发现了一些很棒的编程答案。
我正在修改我正在开发的项目的开源程序TinyCad。我已经访问了TinyCad留言板并发布了,但我没有得到我正在寻找的答案。我无法解决如何将我编写的小型XML转换器类集成到TinyCad的加载函数中的问题。
关于我的一些背景:我没有MFC或Visual Studio的经验,但这是我必须使用的。我习惯使用C ++并使用iostream语法(cout,cin,new等)进行教学,所以我不习惯使用较旧的C代码(如printf,sprintf,malloc,alloc等)。我通常在Qt中从头到尾编写我的程序,但有人告诉我,对于这个项目,我应该修改现有程序以节省时间。如果我必须学习一些完全陌生的东西,我不知道是否会节省那么多时间,但我离题了。
我写了一个小类来读取一个XML文件,该文件的结构与TinyCad读取的XML文件不同。我的类转换它并输出一个中间XML文件。好吧,我不想吐出一个中间文件。我修改它以将输出保存为字符串(使用标准C ++ iostream库中的字符串数据类型)。我希望将此字符串放入流中,以便TinyCad可以打开文件,进行转换,然后继续加载。
我的班级被称为:
std::string blah;
char* filename = "library.xml";
XMLopen myXML(filename, blah);
因此它接收文件名,打开文件,从文件中解析相关信息,将信息放入TinyCad的XML结构中,并将XML代码保存为已通过引用传递的字符串。
我有一个想法是使用istringstream来创建一个流,但这对CFile来说并不好用。我试过这样:
istringstream ins; // Declare an input string stream.
ins.str(blah);
// First open the stream to save to
CFile theFile(ins);
下面是TinyCad中打开并加载所选XML文件的代码:
void CLibraryStore::LoadXML( const TCHAR *filename )
{
// First open the stream to save to
CFile theFile;
// Open the file for saving as a CFile for a CArchive
BOOL r = theFile.Open(filename, CFile::modeRead);
if (r)
{
CString name;
// Create the XML stream writer
CStreamFile stream( &theFile, CArchive::load );
CXMLReader xml( &stream );
// Get the library tag
xml.nextTag( name );
if (name != "Library")
{
Message(IDS_ABORTVERSION,MB_ICONEXCLAMATION);
return;
}
xml.intoTag();
CTinyCadApp::SetLockOutSymbolRedraw( true );
while ( xml.nextTag( name ) )
{
// Is this a symbol?
if (name == "SYMBOL")
{
// Load in the details
xml.intoTag();
CTinyCadMultiSymbolDoc temp_doc;
drawingCollection drawing;
CLibraryStoreNameSet s;
// this is where the stream gets sent to be loaded into the data structure
s.LoadXML( &temp_doc, xml );
xml.outofTag();
// ... and store the symbol
Store( &s, temp_doc );
}
}
xml.outofTag();
CTinyCadApp::SetLockOutSymbolRedraw( false );
}
}
编辑7/28/2010 5:55 PM
所以我尝试制作一个流,但它失败了。
CStreamFile
接收文件名,然后设置为CArchive:
m_pArchive = new CArchive( theFile, nmode );
我尝试像这样CStream
(因为CStreamFile
是一个重载的CStream
):
CString test = blah.c_str();
CStreamMemory streamCS;
streamCS << test;
CXMLReader xml( &streamCS );
但是在streamCS << test;
它根本没有放入流。 <{1}}被test
正确分配,所以我知道这有效。
有关如何处理此事的任何想法?