如何将字符串或流添加到CStreamFile中?

时间:2010-07-28 17:42:03

标签: c++ visual-studio-2008 mfc string stream

这个问题可能看起来有点过于具体,但我想我会在这里试一试,因为我在过去发现了一些很棒的编程答案。

我正在修改我正在开发的项目的开源程序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正确分配,所以我知道这有效。

有关如何处理此事的任何想法?

0 个答案:

没有答案