Как получить строку или поток в CStreamFile? - PullRequest
1 голос
/ 28 июля 2010

этот вопрос может показаться слишком конкретным, но я думаю, что здесь я бы попробовал, поскольку в прошлом я нашел здесь несколько отличных ответов по программированию.

Я изменяю программу с открытым исходным кодом TinyCad для проекта, над которым я работаю. Я посетил доску объявлений TinyCad и опубликовал сообщение, но не получил ответ, который искал. У меня возникают проблемы, когда я не могу понять, как интегрировать небольшой класс конвертера XML, который я написал, в функцию загрузки TinyCad.

Немного предыстории обо мне: у меня нет опыта работы с MFC или Visual Studio, но это то, что я должен использовать. Я привык к C ++ и обучался с использованием синтаксиса iostream (cout, cin, new и т. Д.), Поэтому я также не привык к старому коду C (например, printf, sprintf, malloc, alloc и т. Д.). Я обычно пишу свои программы от начала до конца в Qt, но мне сказали, что для этого проекта я должен изменить существующую программу, чтобы сэкономить время. Я не знаю, сэкономит ли это так много времени, если мне придется выучить что-то совершенно чужое, но я отвлекся.

Я написал небольшой класс для чтения в XML-файле, который структурирован иначе, чем XML-файл, в который TinyCad читает. Мой класс преобразует его и выводит промежуточный XML-файл. Ну, я не хочу выкладывать промежуточный файл. Я изменил его, чтобы сохранить вывод в виде строки (используя строковый тип данных из стандартной библиотеки C ++ iostream). Я хочу передать эту строку в поток, чтобы TinyCad мог открыть файл, выполнить преобразование и продолжить загрузку.

Мой класс называется так:

std::string blah;
char* filename = "library.xml";
XMLopen myXML(filename, blah);

Таким образом, он принимает имя файла, открывает файл, анализирует соответствующую информацию из файла, помещает информацию в структуру XML TinyCad и сохраняет код 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 );

    }
}

Редактировать 28.07.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; поток вообще не включается. test назначается правильно с blah, поэтому я знаю, что это работает.

Есть идеи, как к этому подойти?

...