Форум программистов, компьютерный форум CyberForum.ru

Интересная особенность в работе вектора - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Найти количество нулей в конце записи факториала числа http://www.cyberforum.ru/cpp-beginners/thread1576518.html
Найти количество нулей в конце записи факториала числа n. Подскажет, кто алгоритм? Или хотя бы в какую сторону копать? Если приведете пример кода, буду безмерно благодарен!
C++ Быстрый перебор восьмизначных чисел на С++ Доброго всем вечера, можете подсказать как с этим разобраться? Неободимо перебрать все числа от 1 до 12345678 и проверить что в каждом из них встречается по 1 разу каждая цифра http://www.cyberforum.ru/cpp-beginners/thread1576511.html
C++ Namespace и static-функция
1. Может ли определение static-функции быть вне-класса? Выдает ошибку, просит перенести в тело 2.Как в файле класса cpp, куда я скидываю определение функий, определить пространство имен или что то типо того, чтоб каждый раз не писать class1:: ?
C++ Заполнить базу даных
Привет ребята, нужно заполнить базу данных информацыею про товар. Хочу через стринг. Мне получаеться нужно брать динамечиский масив и стринг?
C++ Разработать алгоритм определения координат опор линий С++ http://www.cyberforum.ru/cpp-beginners/thread1576470.html
задание! Разработать алгоритм определения координат опор линий!
C++ Dev C++ не компилирует Написал простейший "Hello World" в dev c++, нажимаю "Скомпилировать" (Ctrl+F9) вылетает окошко буквально на пару секунд, потом нажимаю "Отладка", пишет типа: "Проект не откомпилирован" что за ерунда? http://www.cyberforum.ru/attachment.php?attachmentid=599112&stc=1&d=1447099095 подробнее

Показать сообщение отдельно
Mesteriis
 Аватар для Mesteriis
371 / 154 / 40
Регистрация: 08.08.2015
Сообщений: 1,061
Завершенные тесты: 1
10.11.2015, 01:14  [ТС]     Интересная особенность в работе вектора
pproger, хм, минимально компилируемый, ну ок
файл main.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
#include <sys/types.h>
#include <sys/stat.h>
#include <dirent.h>
#include <iostream>
#include <stdio.h>
#include <string>
#include <iterator>
#include <vector>
#include <fstream>
#include <unistd.h>
 
#include <func.cpp>
 
 
 
using namespace std;
 
/*  Расширения для хранения
 *  Distrib Mac :   dmg, pkg
 *  Distrib Win :   exe, bat, cmd
 *  Media       :   avi, mkv, mov, mp3, ipg
 *  Sundry      :   rar, zip, ect...
*/
 
void PRINT() // для удобства не обращять внимания
{
    cout << "Печатаем вектор\n";
    for (unsigned int i=0; i<v.size(); ++i)
    {
        cout <<"# "<< i<< "  "<<v[i].number<< "\t Name "<<v[i].NameFiles<<" Type "<< v[i].Type <<endl;
    }
}
 
char Vibor;
//const char FTarget2[27]="/Users/mesteriis/Downloads";
const char Target[36]="/Users/mesteriis/Downloads/uTorrent";
 
 
int main()
{
 
    LoadExclusion();
    v.clear();
    GetDIR(Target);
    unsigned int SumMF=v.size();
    cout << "Размер очереди на копирование = " <<v.size()<< " объектов" << endl;
    cout << "Печатаем: \n";
    for (unsigned int i=0; i<v.size(); ++i)
        {
            cout <<"# "<<v[i].number<< "\t Name "<<v[i].NameFiles<<" Type "<< v[i].Type <<endl;
        }
    cout << "Для продолжения нажмите ENTER\n";
    if (cin.get()=='n') return 0;
    system ("clear");
    cout << "OK! Следуетли включить вывод в файл! И не выводить на экран?  (Да (Y) Нет (N))\n ";
    char view='\0';
    if (cin.get()!='n') view='y'; else view='n';
 
    //Distrib Mac
    vector<MyFilesCopy> DMac;
    for (unsigned int i =0; i<v.size(); ++i)
    {
        if (checkMacFileType(v[i].Type)==true)
        {
            mfc.Number++;
            mfc.NameFiles=v[i].NameFiles;
            mfc.Type=v[i].Type;
            mfc.status=false;
            mfc.Path=v[i].Comment+"/"+v[i].NameFiles+"."+v[i].Type;
            DMac.push_back(mfc);
            v.erase(v.begin()+i);
        }
    }
    if (view=='y')
    {
        cout << "Печатаем DMAC:  Размер вектора = "<<DMac.size()<< " объектов" << endl; ;
        cout <<"# "<<"\t"<<"Name"<<endl;
        for (unsigned int i=0; i<DMac.size(); ++i)
        {
            cout <<"# "<<DMac[i].Number<< "\t"<<DMac[i].NameFiles<<"."<< DMac[i].Type << endl;
        }
    }
    else
    {
        cout << "Размер очереди на копирование DMac   = "   <<DMac.size()<< " объектов" << endl;
    }
    cout << endl;
    auto ss=checkMacFileType(v[14].Type); // проверял
    cout << ss << "  "<< v[14].Type << endl; //проверял
 
    cin.get();
    //Distrib Win
    mfc.Number=0;
    vector<MyFilesCopy> DWin;
    for (unsigned int i =0; i<v.size(); ++i)
    {
        if (checkWinFileType(v[i].Type)==1)
        {
            mfc.Number++;
            mfc.NameFiles=v[i].NameFiles;
            mfc.Type=v[i].Type;
            mfc.status=false;
            mfc.Path=v[i].Comment+"/"+v[i].NameFiles+"."+v[i].Type;
            DWin.push_back(mfc);
            v.erase(v.begin()+i);
        }
    }
    if (view=='y')
    {
        cout << "Печатаем DWIN:  Размер вектора = "<<DWin.size()<< " объектов" << endl;;
            for (unsigned int i=0; i<DWin.size(); ++i)
                {
                    cout <<"# "<<DWin[i].Number<< "\t Name "<<DWin[i].NameFiles<<" Type "<< DWin[i].Type << endl;
                }
    }
    else
    {
        cout << "Размер очереди на копирование DWin   = "   <<DWin.size()<< " объектов" << endl;
    }
 
    //Media
    cout << endl;
    mfc.Number=0;
    vector<MyFilesCopy> Media;
    for (unsigned int i =0; i<v.size(); ++i)
    {
        if (checkMediaFileType(v[i].Type)==1)
        {
            mfc.Number++;
            mfc.NameFiles=v[i].NameFiles;
            mfc.Type=v[i].Type;
            mfc.status=false;
            mfc.Path=v[i].Comment+"/"+v[i].NameFiles+"."+v[i].Type;
            Media.push_back(mfc);
            v.erase(v.begin()+i);
        }
    }
    if (view=='y')
    {
        cout << "Печатаем Media:  Размер вектора ="<<Media.size()<< " объектов" << endl;;
            for (unsigned int i=0; i<Media.size(); ++i)
                {
                    cout <<"# "<<Media[i].Number<< "\t Name "<<Media[i].NameFiles<<" Type "<< Media[i].Type << endl;
                }
    }
    else
    {
        cout << "Размер очереди на копирование DWin   = "<<Media.size()<< " объектов" << endl;
    }
    cout << "test";
    //Sundry
 
    cout << endl;
    cout << "Смотрим и проверяем? для продолжения нажмите ENTER!\n";
    cin.get();
    system("clear");
    if (v.size()!=0) cout << "Осталось разобрать непонятки! Только ручками только хард-кор!\n";
    cout << "Их всего " << v.size() << endl;
    mfc.Number=0;
    vector<MyFilesCopy>Sundry;
    cout << "Дистрибутив Маc OS X (m), Windows (w). Мультимедиа файл (p). Разное (s).\n";
 
    PRINT(); //!
    int xx;
    do
    {
        for (unsigned int i=0; i<v.size(); ++i)
        {
            mfc.Number=10000;
            mfc.NameFiles=v[i].NameFiles;
            mfc.Type=v[i].Type;
            mfc.status=false;
            mfc.Path=v[i].Comment+"/"+v[i].NameFiles+"."+v[i].Type;
            cout <<"# "<<v[i].number    <<" \t"
                 <<v[i].NameFiles       <<" \t"
                 << v[i].Type           << " Что это? ";
            char Vibor;
            cin >> Vibor;
            switch (Vibor)
            {
                case 'm': DMac.push_back(mfc);   v.erase(v.begin()+i); break;
                case 'w': DWin.push_back(mfc);   v.erase(v.begin()+i); break;
                case 'p': Media.push_back(mfc);  v.erase(v.begin()+i); break;
                case 's': Sundry.push_back(mfc); v.erase(v.begin()+i); break;
                default: cout << "Некоректный ввод\n"; break;
            }
        xx=v.size();
        }
    } while (xx!=0);
    PRINT(); //!
    if (v.size()!=0) cout << "Первичный вектор не пуст, вы точно хотите продолжить?\n";
    cout << endl;
    cout << "Осталось не обработано               = "   <<v.size()<< " объектов" << endl;
    cout << "Размер очереди на копирование DMac   = "   <<DMac.size()<< " объектов" << endl;
    cout << "Размер очереди на копирование DWin   = "   <<DWin.size()<< " объектов" << endl;
    cout << "Размер очереди на копирование Media  = "   <<Media.size()<< " объектов" << endl;
    cout << "Размер очереди на копирование Sundry = "   <<Sundry.size()<< " объектов" << endl;
    if (SumMF!=(v.size()+DMac.size()+DWin.size()+Media.size()+Sundry.size()))
    {
            cout << "Что то потеряли, запускаю проверку ...\n";}else
            {
                cout << "Вроде все ОК! Продолжаем!\n";
            }
    return 0;
}
файл func.cpp:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
#include <func.hpp>
 
bool getValueFromFile(const std::string& filename, const std::string& paramName, std::string& paramValue)
{
   std::ifstream inFile (filename); //создать поток
      if (!inFile.is_open()) //проверить открыт ли файл
      return false;
 
   paramValue.clear();
   std::string line, name;
  while (getline(inFile, line)) //прочитать строку
   {
 
       //парсим прочитанную строку файла
      name = line.substr(0, line.find(' '));
      if (name == paramName)
      {
     paramValue = line.substr(name.size() +1, line.find(';'));
     break;
      }
   }
   inFile.close();
   if (paramValue.empty())
      return false;
   return true;
}
 
void saveLogToFile(char& type, const std::string& EventLog, const bool rewrite)
{
    std::string filename;
    switch (type)
    {
    case 'e':
        filename = "log/Log_Err.txt";
        break;
    case 'l':
        filename = "log/Log.txt";
        break;
    case 'g':
        filename = "log/Log_event.txt";
        break;
   }
   std::ofstream outFile (filename, rewrite ? std::ios::out : std::ios::app); //создать поток
   if (!outFile.is_open()) std::cout << "Unable to write " << std::endl;
   outFile << EventLog << ";\n";
   outFile.close();
}
 
void GetDIR(const char *Target)
{
    char WorkDir[FILENAME_MAX];
    getcwd(WorkDir, sizeof(WorkDir));
    chdir(Target);
    DIR *dir = opendir(Target);
    if(dir)
    {
    struct dirent *ent;
 
        while((ent = readdir(dir)) != NULL)
        {
        ++mf.number;
        std::string tmp=ent->d_name;
        //Отсеиваем мусор
        auto dotPos = tmp.find('.');
        if ((dotPos + 2) >= tmp.size())
        {
            continue;
        }
        struct stat buf;
        stat((ent->d_name), &buf);
        if ((buf.st_mode &S_IFMT)==32768)
        {
            auto extPos= tmp.size()-4;
            auto eolPos =  tmp.find('\n');
            mf.Comment=Target;
            mf.NameFiles=tmp.substr(0, extPos);
            mf.Type=tmp.substr(mf.NameFiles.size()+1, eolPos);
            v.push_back(mf);
            continue;
        } else
            if ((buf.st_mode &S_IFMT)==16384)
            {
            mf.Comment=Target;
            mf.NameFiles=tmp;
            mf.Type="DIR";
            v.push_back(mf);
            continue;
            }
        }
    }else std::cout << "Error opening directory\n";
    chdir(WorkDir);
}
// Проверяем принадлежность к типам данных
inline bool checkMediaFileType(std::string const & type)
{
    static const char * types[] = {
        "avi", "mkv", "mp3", "ipg", "png"
    };
    for(char const * curType : types)
        if(type == curType)
            return true;
    return false;
}
 
inline bool checkMacFileType(std::string const & type)
{
    static const char * types[] = {
        "dmg", "pkg"
    };
    for(char const * curType : types)
        if(type == curType)
            return true;
    return false;
}
 
inline bool checkWinFileType(std::string const & type)
{
    static const char * types[] = {
        "exe", "bat", "cmd", "msi"
    };
    for(char const * curType : types)
        if(type == curType)
            return true;
    return false;
}
//Загрузка исключений из файла "Exclusion"
bool LoadExclusion()
{
    std::string filename = "Exclusion";
    std::ifstream inFile (filename); //создать поток
    if (!inFile.is_open()) //проверить открыт ли файл
    {
        std::cout<< "Файл с исключениями не найден, продолжить без него? Нет (n)\n";
        std::cin.get();
        if (std::cin.get()=='n') return false;
    }
    Excl.clear();
    myExc.Number=0;
    std::string line, name;
    while (getline(inFile, line)) //прочитать строку
        {
            //парсим прочитанную строку файла
            name = line.substr(0, line.find('\n'));
            myExc.Number++;
            myExc.Name=name;
            Excl.push_back(myExc);
        }
    inFile.close();
    std::cout << "Исключения:\n";
    for (unsigned int i=0; i<Excl.size(); ++i)
        {
            std::cout<< Excl[i].Number<< "e = " <<Excl[i].Name<<std::endl;
        }
    std::cout<<"Продолжаем ENTER, выход n\n";
    if (std::cin.get()=='n')
    {
        std::cout<<"Выход и программы\n";
        sleep(2);
        return false;
    }
    std::cout << "исключения добавлены";
    return true;
}
файл func.hpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
#ifndef FUNC
#define FUNC
struct MyFiles
{
    int number;             //№ по порядку
    std::string NameFiles;  //собственно имя
    std::string Type;       //расширение нужно для последующей сортировки
    bool status;            //Отметка об удачном копировании
    std::string Comment;    //коментарии для логирования
};
MyFiles mf;
std::vector<MyFiles> v;
//для непосредственного копирования
struct MyFilesCopy
{
    int Number;
    std::string NameFiles;  //собственно имя
    std::string Type;       //расширение нужно для последующей сортировки
    bool status;            //Отметка об удачном копировании
    std::string Path;       //путь к файлу
    bool Triger;            //для ручного разбора
};
MyFilesCopy mfc;
 
//исключения
struct MyExclusion
{
    int Number;
    std::string Name;
};
MyExclusion myExc;
std::vector<MyExclusion> Excl;
 
bool LoadExclusion();
 
bool getValueFromFile(const std::string& filename, const std::string& paramName, std::string& paramValue);
 
void saveLogToFile(char& type, const std::string& EventLog, const bool rewrite);
 
void GetDIR(const char *Target);
 
inline bool checkMediaFileType(std::string const & type);
 
inline bool checkMacFileType(std::string const & type);
 
inline bool checkWinFileType(std::string const & type);
#endif // FUNC
Что бы уж точно компилируемый!
 
Текущее время: 04:10. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru