этот вопрос может показаться слишком конкретным, но я думаю, что здесь я бы попробовал, поскольку в прошлом я нашел здесь несколько отличных ответов по программированию.
Я изменяю программу с открытым исходным кодом 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
, поэтому я знаю, что это работает.
Есть идеи, как к этому подойти?