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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.70
hu2
0 / 0 / 0
Регистрация: 01.05.2011
Сообщений: 9
#1

Проблема с <vector> - C++

25.01.2012, 15:15. Просмотров 1352. Ответов 24
Метки нет (Все метки)

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
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
 
void smb_in();
 
int main()
{
    smb_in();
    return 0;
}
 
void smb_in()
{
    ifstream in("text.txt", ios::binary);                   //Открываем в бинарном режиме файл для чтения
    vector<char> smb_name;                                  //Создаем вектор для "названия" символов
    vector<unsigned long> smb_n;                            //Вектор для подсчета количества символов
 
    while (!in.eof())                                       //Пока не достигнем конца файла
    {
        char smb_cur;
        in.get(smb_cur);                                    //Текущий символ в цикле
        
        int i = 0;
        for (i = 0; i <= smb_name.size(); i++)
            if (smb_name[i] != smb_cur) break;              //Если находим в векторе совпадающий символ прерываем цикл
 
        if (i == smb_name.size())                           //Если символ не найден, то ...
        {
            smb_name.push_back(smb_cur);                    //Добавляем в базу его "имя"
            smb_n.push_back(1);                             //И кол-во повторений (1)
        }
        else smb_n[i]++;
    }
    
    in.close();                                             //Закрываем файл
 
    for (int j = 0; j <= smb_name.size(); j++)              //Выводим собранную базу на экран
        cout << smb_name[j] << ' ' << smb_n[j] << endl;
}
После компиляции и запуска вылетает ошибка, почему это происходит?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.01.2012, 15:15
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Проблема с <vector> (C++):

Проблема с vector - C++
Объявляю булевый вектор vector&lt;bool&gt; used; затем заполняю его false'ами for (int i=0; i&lt;n; i++) used = false; выходит...

Проблема с vector - C++
Здравствуйте! Есть класс BucketSort: #ifndef BUCKETSORT_H #define BUCKETSORT_H #include &lt;vector&gt; class BucketSort { ...

Проблема с итератором в <vector> - C++
Всем привет. Помогите пожалуйста решить проблему: У меня существует класс class Book { string author,title,publishing; int...

error LNK2019: ссылка на неразрешенный внешний символ "public: __thiscall Vector<int>::Vector<int>(void)" (?0?$Vector@H@@QAE@XZ) в функции _main - C++
//Vector.h #include &lt;iostream&gt; #include &lt;Windows.h&gt; #include &lt;climits&gt; #include &lt;vector&gt; #include &lt;stdlib.h&gt; #include &lt;fstream&gt;...

Как можно увеличить размер вектора, который является элементом вектора vector<vector<int>>arr(n, vector <int>) - C++
Написал программу, которая создает вектор 'а' векторов 'b', вектора 'b' содержат 2 числа. Стало интересно, как нужно изменить программу...

vector<Struct2{int,vector<struct1>}> или множественное наследование ... - C++
Здравствуйте! Помогите, пожалуйста. Есть такие данные: typedef struct { int x; int y; // координаты...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Mayonez
380 / 272 / 21
Регистрация: 26.12.2009
Сообщений: 875
25.01.2012, 15:19 #2
C++
1
2
 if (smb_name[i] != smb_cur) break; 
'!=' ---> '=='
Добавлено через 1 минуту
C++
1
ios::binary
не нужно, нас вполне устраивает текстовый режим (для подсчета символов же?)
hu2
0 / 0 / 0
Регистрация: 01.05.2011
Сообщений: 9
25.01.2012, 15:27  [ТС] #3
О, спасибо за первое замечание, я исправил, но все равно почему-то выкидывает, а по поводу
C++
1
ios::binary
я собрался написать архиватор по алгоритму Хаффмана, а там же надо учитывать все символы
Mayonez
380 / 272 / 21
Регистрация: 26.12.2009
Сообщений: 875
25.01.2012, 15:30 #4
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
#include <iostream>
#include <fstream>
#include <map>
 
using namespace std;
 
void smb_in();
 
int main()
{
        smb_in();
        return 0;
}
 
void smb_in()
{
    map<char, int> charBase;
    ifstream fin("in.txt");
    map<char, int>::iterator p;
    while(!fin.eof())
    {
        char tmp = fin.get();
        p = charBase.find(tmp);
        if(p == charBase.end())
            charBase.insert(make_pair(tmp, 1));
        else
            p->second++;
    }
    
    for(p = charBase.begin(); p != charBase.end(); p++)
        cout << p->first << " : " << p->second << endl;
}
Добавлено через 2 минуты
Цитата Сообщение от hu2 Посмотреть сообщение
вылетает ошибка
какая?
hu2
0 / 0 / 0
Регистрация: 01.05.2011
Сообщений: 9
25.01.2012, 15:33  [ТС] #5
Map - это что-то вроде динамической матрицы? могли бы вы мне объяснить подробнее

Добавлено через 2 минуты
Цитата Сообщение от Mayonez Посмотреть сообщение
какая?
http://dl.dropbox.com/u/25484904/errw.png
Mayonez
380 / 272 / 21
Регистрация: 26.12.2009
Сообщений: 875
25.01.2012, 15:37 #6
Map - это карта, в данном случае содержит в себе вот такие пары <char, int>: символ и количество его вхождений

Добавлено через 2 минуты
узайте smb_n[i]++; smb_n.at(i); метод вектора .at()
hu2
0 / 0 / 0
Регистрация: 01.05.2011
Сообщений: 9
25.01.2012, 15:42  [ТС] #7
Цитата Сообщение от Mayonez Посмотреть сообщение
Map - это карта, в данном случае содержит в себе вот такие пары <char, int>: символ и количество его вхождений
Понятно, пошел читать про map и итераторы, но все-таки интересно, что же там такое случилось в студии, что выскакивает окно
at не спасает

Добавлено через 3 минуты
ошибка появляется после строчки
C++
1
smb_name.push_back(smb_cur);
Mayonez
380 / 272 / 21
Регистрация: 26.12.2009
Сообщений: 875
25.01.2012, 15:44 #8
Цитата Сообщение от hu2 Посмотреть сообщение
но все-таки интересно, что же там такое случилось в студии, что выскакивает окно
понятно, вы спрашивали одно, а я что-то отписался от темы. Вот ваш переработанный код:
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
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
 
void smb_in();
 
int main()
{
        smb_in();
        return 0;
}
 
void smb_in()
{
        ifstream in("in.txt");                                   //Открываем в бинарном режиме файл для чтения
        vector<char> smb_name;                                                                  //Создаем вектор для "названия" символов
        vector<unsigned long> smb_n;                                                    //Вектор для подсчета количества символов
 
        while (!in.eof())                                                                               //Пока не достигнем конца файла
        {
                char smb_cur;
                in.get(smb_cur);                                                                        //Текущий символ в цикле
                
                int i = 0;
                for (i = 0; i < smb_name.size(); i++)
                        if (smb_name[i] == smb_cur) 
                            break;                              //Если находим в векторе совпадающий символ прерываем цикл
 
                if (i == smb_name.size())                                                       //Если символ не найден, то ...
                {
                        smb_name.push_back(smb_cur);                                    //Добавляем в базу его "имя"
                        smb_n.push_back(1);                                                             //И кол-во повторений (1)
                }
                else smb_n[i]++;
        }
        
        in.close();                                                                                             //Закрываем файл
 
        for (int j = 0; j < smb_name.size(); j++)                              //Выводим собранную базу на экран
                cout << smb_name[j] << ' ' << smb_n[j] << endl;
}
ошибка была в том, что вы делали вот так
C++
1
i <= smb_name.size()
а нужно <, так ка нумерация с 0
hu2
0 / 0 / 0
Регистрация: 01.05.2011
Сообщений: 9
26.01.2012, 11:27  [ТС] #9
ммм while зацикливается...

Добавлено через 56 секунд
он просто не попадает в for

Добавлено через 11 минут
попробовал так
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
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
 
void smb_in();
 
int main()
{
    smb_in();
    return 0;
}
 
void smb_in()
{
    ifstream in("text.txt", ios::binary);                   //Открываем в бинарном режиме файл для чтения
    vector<char> smb_name;                                  //Создаем вектор для "названия" символов
    vector<unsigned long> smb_n;                            //Вектор для подсчета количества символов
 
    smb_name.push_back(' ');                    
    smb_n.push_back(0);
 
    while (!in.eof())                                       //Пока не достигнем конца файла
    {
        char smb_cur;
        in.get(smb_cur);                                    //Текущий символ в цикле
        
        int i = 0;
        for (i = 0; i < smb_name.size(); i++)
            if (smb_name[i] == smb_cur) break;              //Если находим в векторе совпадающий символ прерываем цикл
 
        if (i == smb_name.size())                           //Если символ не найден, то ...
        {
            smb_name.push_back(smb_cur);                    //Добавляем в базу его "имя"
            smb_n.push_back(1);                             //И кол-во повторений (1)
        }
        else smb_n.at(i);
    }
    
    in.close();                                             //Закрываем файл
 
    for (int j = 0; j < smb_name.size(); j++)               //Выводим собранную базу на экран
        cout << smb_name[j] << ' ' << smb_n[j] << endl;
}
Но все-равно висит консоль

Добавлено через 19 часов 26 минут
Нашел ошибку:
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
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
 
void smb_in(char *name);
 
int main()
{
        char *name;
        cout << "Enter the path: ";
        cin >> name; smb_in(name);
        return 0;
}
 
void smb_in(char *name)
{
        ifstream in(name, ios::in | ios::binary);                               //Открываем в бинарном режиме файл для чтения
        vector<char> smb_name;                                                  //Создаем вектор для "названия" символов
        vector<unsigned long> smb_n;                                            //Вектор для подсчета количества символов
 
        while (!in.eof())                                                       //Пока не достигнем конца файла
        {
                char smb_cur;
                in.get(smb_cur);                                                //Текущий символ в цикле
                
                int i = 0;
                for (i = 0; i < smb_name.size(); i++)
                        if (smb_name[i] == smb_cur) break;                      //Если находим в векторе совпадающий символ прерываем цикл
 
                if (i == smb_name.size())                                       //Если символ не найден, то ...
                {
                        smb_name.push_back(smb_cur);                            //Добавляем в базу его "имя"
                        smb_n.push_back(1);                                     //И кол-во повторений (1)
                }
                else smb_n.at(i)++;
        }
        
        in.close();                                                             //Закрываем файл
 
        for (int j = 0; j < smb_name.size(); j++)                               //Выводим собранную базу на экран
            cout << smb_name[j] << " - " << smb_n[j] << endl;
}
Оказывается
C++
1
ios::in
- это важно
fasked
Эксперт С++
4934 / 2514 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
26.01.2012, 11:53 #10
hu2, ifstream по-умолчанию in. ofstream по-умолчанию out. Изначальная ошибка была в выходе за границу массива, о чем любезно сообщалось в assertion. Метод at() бросает соответствующее исключение, которое Вы не отлавливаете. Неотловленное исключение всегда приводит к terminate.
hu2
0 / 0 / 0
Регистрация: 01.05.2011
Сообщений: 9
26.01.2012, 12:09  [ТС] #11
Цитата Сообщение от fasked Посмотреть сообщение
hu2, ifstream по-умолчанию in. ofstream по-умолчанию out. Изначальная ошибка была в выходе за границу массива, о чем любезно сообщалось в assertion. Метод at() бросает соответствующее исключение, которое Вы не отлавливаете. Неотловленное исключение всегда приводит к terminate.
Я это все прекрасно понял и благодарю за ответ, но без ios::in вся эта конструкция после прочтения символа из файла не переводит указатель на следующий, по крайней мере, в msvs2010
fasked
Эксперт С++
4934 / 2514 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
26.01.2012, 12:43 #12
Цитата Сообщение от hu2 Посмотреть сообщение
Я это все прекрасно понял и благодарю за ответ, но без ios::in вся эта конструкция после прочтения символа из файла не переводит указатель на следующий, по крайней мере, в msvs2010
Ну хватит сказки то рассказывать. В идеале, эта конструкция должна была упасть после прочтения первого же символа из файла Код некорректен - как следствие работает не так как ожидается и ios::in здесь не при чем.
hu2
0 / 0 / 0
Регистрация: 01.05.2011
Сообщений: 9
26.01.2012, 13:20  [ТС] #13
Цитата Сообщение от fasked Посмотреть сообщение
Ну хватит сказки то рассказывать. В идеале, эта конструкция должна была упасть после прочтения первого же символа из файла Код некорректен - как следствие работает не так как ожидается и ios::in здесь не при чем.
Все так и есть она и падала после первого символа, я понял все свои ошибки, но все-таки попробуйте скомпилировать программу с ios::in и без него, если вы мне не верите, и посмотрите на результат

Добавлено через 2 минуты
get() просто будет читать первый символ файла, пока вручную не завершить прогу
fasked
Эксперт С++
4934 / 2514 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
26.01.2012, 13:48 #14
Цитата Сообщение от hu2 Посмотреть сообщение
Все так и есть она и падала после первого символа, я понял все свои ошибки, но все-таки попробуйте скомпилировать программу с ios::in и без него, если вы мне не верите, и посмотрите на результат

Добавлено через 2 минуты
get() просто будет читать первый символ файла, пока вручную не завершить прогу
Не знаю, что должна делать Ваша программа, но лично у меня после исправлений ошибок в циклах, она не зависает Вполне себе завершается и даже что-то выводит на экран.
hu2
0 / 0 / 0
Регистрация: 01.05.2011
Сообщений: 9
26.01.2012, 15:17  [ТС] #15
эх... для моего мелкомягкого компилятора это преступление ту строчку не написать
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.01.2012, 15:17
Привет! Вот еще темы с ответами:

Ошибка [Linker error] undefined reference to `Vector::Vector(int)' - C++
Добрый день. Делал по методички, и почему-то валятся ошибки... файл lab9_main.cpp #include &lt;iostream&gt; #include &quot;Vector.h&quot; int...

Как корректно скопировать vector в vector внутри класса - C++
Есть класс принимающий в конструкторе vector: class test { test(std::vector&lt;std::string&gt; codeList); ~test(); ...

Указатель на объект вектор в векторе vector < vector<int>* >* - C++
Дело касается вот чего, есть такая вот незатейлевая вещь. #include &lt;vector&gt; #include &lt;iostream&gt; int main( ) { using...

Записать числа из файла в двумерный массив или вектор вроде такого vector<vector<int>> - C++
Добрый день, подскажите пожалуйста как лучше и проще считывать файл. в файле записаны числа, разделенные пробелами и запятыми: 1, 2, 3,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
26.01.2012, 15:17
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru