|
Нужна помощь с С++ | ☑ | ||
---|---|---|---|---|
0
Arxangel06
14.11.15
✎
21:37
|
Доброго времени суток, Форумчане.
Не знаю, в какую секцию этот вопрос поместить, поэтому положил сюда. Есть такая простая на первый взгляд задача: 1. Есть файл, сформированный при помощи класса CArchive. Внутри файла на самом деле таблица из ~10 колонок. 2. Нужно этот файл прочитать, разобрать и записать в виде human-readable таблицы - xls, csv, хоть dbf, лишь бы её можно было редактировать. 3. Провести обратную операцию, т.е. из человеческой таблицы сформировать аналог оригинального файла. Формулируется вроде просто, но попытка реализовать это в Visual Studio 2012 не то что успехом не увенчалась, а я в принципе ничего не понял... Может кто-нибудь ткнуть в пример, как это реализовать "по-простому"? Может надо VS взять какой-нибудь подревнее, там попроще будет? Спасибо. |
|||
1
Woldemar177
14.11.15
✎
22:25
|
Надо найти программиста С++
|
|||
2
Garykom
гуру
14.11.15
✎
22:53
|
(0) "human-readable" - сразу какие то нехорошие дежавю...
|
|||
3
Garykom
гуру
14.11.15
✎
22:54
|
(1) этого мало, надо ведь еще найти $ на оплату этого "программиста С++"
хотя может он согласится на бартер )) |
|||
4
trdm
14.11.15
✎
22:56
|
Пример:
bool CMyADO::SaveOrLoad(bool bSave, bool bClearAll) { CFile file; if (bSave){ file.Open(m_sFileDataName, CFile::modeWrite | CFile::modeCreate); // создать файл } else { CFileStatus pFS; if (!CFile::GetStatus(m_sFileDataName, pFS)){ return true; } file.Open(m_sFileDataName, CFile::modeRead); // создать файл //CArchive ar(&file, CArchive::load); } if (bSave){ if (m_StateSubs == 1){ SaveOrLoadSubsSelection(); } } CArchive ar(&file, bSave?CArchive::store:CArchive::load); int iSubCnt = m_SubSelfs.GetCount(); int iObjAndSubCnt = m_ObjToSub.GetCount(); if (bSave){ ar << m_iVersion; ar << iSubCnt; ar << m_StateSubs; ar << m_LastIDSubs; ar << iObjAndSubCnt; } else { ar >> m_iVersion; ar >> iSubCnt; ar >> m_StateSubs; ar >> m_LastIDSubs; ar >> iObjAndSubCnt; } int i = 0; if (iSubCnt>0){ CString key; if (bSave){ // выгружаем данные подсистем. POSITION pos = m_SubSelfs.GetStartPosition(); SubsStorage* strSS; while (pos != NULL) { m_SubSelfs.GetNextAssoc( pos, key, (CObject*&)strSS ); ar << strSS->m_ID; ar << strSS->m_Check; ar << strSS->m_IDParent; ar << strSS->m_Name; if (bClearAll){ delete strSS; strSS = NULL; } } if (bClearAll) m_SubSelfs.RemoveAll(); pos = m_ObjToSub.GetStartPosition(); // выгружаем связку объект-подсистемы CString sSubsistem = ""; while (pos != NULL) { m_ObjToSub.GetNextAssoc( pos, key, sSubsistem ); ar << key; ar << sSubsistem; } if (bClearAll) m_ObjToSub.RemoveAll(); } else { int i; for (i = 0; i<iSubCnt; i++) { SubsStorage* strSSAdd = new SubsStorage; ar >> strSSAdd->m_ID; ar >> strSSAdd->m_Check; ar >> strSSAdd->m_IDParent; ar >> strSSAdd->m_Name; key.Format("%d",strSSAdd->m_ID); m_SubSelfs.SetAt(key,(CObject*&)strSSAdd); } for (i = 0; i<iObjAndSubCnt; i++) { CString sKey="", sAllSubsObj = ""; ar >> sKey; ar >> sAllSubsObj; m_ObjToSub.SetAt(sKey, sAllSubsObj); } } } ar.Close(); // закрыть архив file.Close(); // закрыть файл return true; } |
|||
5
Arxangel06
14.11.15
✎
22:58
|
(2) Не-не-не, это так, к слову пришлось :)
(4) Супер, пошел вставлять в код и разбираться. Спасибо. |
|||
6
Garykom
гуру
14.11.15
✎
23:04
|
(5) "пошел вставлять в код и разбираться" - надежды юношей питают ))
ЗЫ вот чем я не люблю c++ так тем что в отличие от java, c# и подобных не могу просто "читать код" и понимать что он делает (( |
|||
7
Garykom
гуру
14.11.15
✎
23:05
|
(6)+ хотя это логично в c++ практики почти 0
а от изучения без разбора кучи чужого кода толку мало |
|||
8
trdm
14.11.15
✎
23:08
|
(6) какая строчка непонятна то?
|
|||
9
Arxangel06
14.11.15
✎
23:11
|
(6) Ну вот же тролль, а :)
Я что-то понял из кода, 15 лет назад "проходил" С(для avr)... не понял самого главного - куда я этот код должен вставить :) Решение мне видится в виде простейшего приложения - окошко выбора входного файла и две кнопки - "прочитать CArchive" и "прочитать таблицу". Процедура обработки событий читает содержимое файла, имя файла лежит в переменной из первого окошка, а потом обработанный файл записывает в требуемом виде. (8) Логика понятна, по строчкам тоже все прозрачно. Не понял, как и откуда вызвать этот код. |
|||
10
trdm
14.11.15
✎
23:14
|
это просто пример как работать с CArchive.
не более того. |
|||
11
RomanYS
14.11.15
✎
23:22
|
(9) не делай окошко, делай консольное приложение, имя файла и режим запуска в параметры
|
|||
12
Garykom
гуру
14.11.15
✎
23:41
|
(8) построчно понятно, говорю де читать не могу бегло, приходится переводить мысленно, спотыкаясь почти везде
(9) https://bytes.com/topic/c-sharp/answers/257353-interesting-problem-serializing-mfc-carchive-reading-out-using-c-binaryreader - мне вот проще так |
|||
13
Arxangel06
14.11.15
✎
23:41
|
(10) может быть и "не более", но понятно и прозрачно. И понятно, куда идти дальше.
(11) здравая мысль - меньше кода, меньше проблем. Всем спасибо за участие, задача практически решена, осталось подсчитать количество полей и вывести их в читаемую таблицу. Остановлюсь пожалуй на csv. |
|||
14
НеМогуВойтиВ Аккаунт2
14.11.15
✎
23:42
|
(11) +1
Через консоль надо делать. Я работал с 6 visual studio правда много-много лет назад. Делал похожее, но деталей не помню даже близко. Ну и на вскидку формат csv лучше брать. |
|||
15
Garykom
гуру
14.11.15
✎
23:42
|
||||
16
spectre1978
15.11.15
✎
09:01
|
(6) пример элементарный. Уж на что я MFC не знаю, но написано очень прозрачно
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |