Имя: Пароль:
IT
Админ
Нужна помощь с С++
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 не знаю, но написано очень прозрачно