Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.75/8: Рейтинг темы: голосов - 8, средняя оценка - 4.75
hu2
0 / 0 / 0
Регистрация: 01.05.2011
Сообщений: 9
#1

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

25.01.2012, 15:15. Просмотров 1458. Ответов 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;
}
После компиляции и запуска вылетает ошибка, почему это происходит?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.01.2012, 15:15
Ответы с готовыми решениями:

Проблема с vector
Объявляю булевый вектор vector&lt;bool&gt; used; затем заполняю его false'ами...

Проблема с vector
Здравствуйте! Есть класс BucketSort: #ifndef BUCKETSORT_H #define...

Проблема с итератором в <vector>
Всем привет. Помогите пожалуйста решить проблему: У меня существует класс ...

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

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

24
Mayonez
382 / 274 / 53
Регистрация: 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
не нужно, нас вполне устраивает текстовый режим (для подсчета символов же?)
0
hu2
0 / 0 / 0
Регистрация: 01.05.2011
Сообщений: 9
25.01.2012, 15:27  [ТС] #3
О, спасибо за первое замечание, я исправил, но все равно почему-то выкидывает, а по поводу
C++
1
ios::binary
я собрался написать архиватор по алгоритму Хаффмана, а там же надо учитывать все символы
0
Mayonez
382 / 274 / 53
Регистрация: 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 Посмотреть сообщение
вылетает ошибка
какая?
0
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
0
Mayonez
382 / 274 / 53
Регистрация: 26.12.2009
Сообщений: 875
25.01.2012, 15:37 #6
Map - это карта, в данном случае содержит в себе вот такие пары <char, int>: символ и количество его вхождений

Добавлено через 2 минуты
узайте smb_n[i]++; smb_n.at(i); метод вектора .at()
0
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);
0
Mayonez
382 / 274 / 53
Регистрация: 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
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
- это важно
0
fasked
Эксперт С++
4981 / 2560 / 241
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
26.01.2012, 11:53 #10
hu2, ifstream по-умолчанию in. ofstream по-умолчанию out. Изначальная ошибка была в выходе за границу массива, о чем любезно сообщалось в assertion. Метод at() бросает соответствующее исключение, которое Вы не отлавливаете. Неотловленное исключение всегда приводит к terminate.
0
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
0
fasked
Эксперт С++
4981 / 2560 / 241
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
26.01.2012, 12:43 #12
Цитата Сообщение от hu2 Посмотреть сообщение
Я это все прекрасно понял и благодарю за ответ, но без ios::in вся эта конструкция после прочтения символа из файла не переводит указатель на следующий, по крайней мере, в msvs2010
Ну хватит сказки то рассказывать. В идеале, эта конструкция должна была упасть после прочтения первого же символа из файла Код некорректен - как следствие работает не так как ожидается и ios::in здесь не при чем.
0
hu2
0 / 0 / 0
Регистрация: 01.05.2011
Сообщений: 9
26.01.2012, 13:20  [ТС] #13
Цитата Сообщение от fasked Посмотреть сообщение
Ну хватит сказки то рассказывать. В идеале, эта конструкция должна была упасть после прочтения первого же символа из файла Код некорректен - как следствие работает не так как ожидается и ios::in здесь не при чем.
Все так и есть она и падала после первого символа, я понял все свои ошибки, но все-таки попробуйте скомпилировать программу с ios::in и без него, если вы мне не верите, и посмотрите на результат

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

Добавлено через 2 минуты
get() просто будет читать первый символ файла, пока вручную не завершить прогу
Не знаю, что должна делать Ваша программа, но лично у меня после исправлений ошибок в циклах, она не зависает Вполне себе завершается и даже что-то выводит на экран.
1
hu2
0 / 0 / 0
Регистрация: 01.05.2011
Сообщений: 9
26.01.2012, 15:17  [ТС] #15
эх... для моего мелкомягкого компилятора это преступление ту строчку не написать
0
vetal10
35 / 35 / 11
Регистрация: 25.05.2010
Сообщений: 211
26.01.2012, 21:44 #16
можно через мар вот так сделать
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include<iostream>
#include<map>
#include<fstream>
void sm_in();
int main(){
sm_in();
return 0;
}
 
void sm_in(){
std::map<char,int> c;
ifstream in("text.txt");
while(!in.eof)
++c[(char)in.get()];
in.close();
std::map<char,int>::const_iterator end=c.end();
for(std::map<char,int>::const_iterator i=c.begin();i!=end;i++)
std::cout<<i->first<<"\t"<<i->second<<std::endl;
}
0
isaak
111 / 48 / 19
Регистрация: 17.10.2010
Сообщений: 706
26.01.2012, 22:11 #17
А почему компилятор ругается на

1 IntelliSense: identifier "ifstream" is undefined c:\users\администратор\documents\visual studio 2010\projects\c++\console\p1514\vector\vector\vector.cpp 12 1 Vector
Заранее огромное спасибо.
0
NoMasters
Псевдослучайный
1909 / 1120 / 90
Регистрация: 13.09.2011
Сообщений: 3,178
26.01.2012, 22:14 #18
std::ifstream
2
isaak
111 / 48 / 19
Регистрация: 17.10.2010
Сообщений: 706
26.01.2012, 22:19 #19
Спасибо за ответ, но сейчас другая ошибка указывает на строку:
C++
1
while(!in.eof)
1 IntelliSense: a pointer to a bound function may only be used to call the function c:\users\администратор\documents\visual studio 2010\projects\c++\console\p1514\vector\vector\vector.cpp 13 10 Vector
0
NoMasters
Псевдослучайный
1909 / 1120 / 90
Регистрация: 13.09.2011
Сообщений: 3,178
26.01.2012, 22:21 #20
C++
1
while(!in.eof())
1
26.01.2012, 22:21
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.01.2012, 22:21

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

Ошибка [Linker error] undefined reference to `Vector::Vector(int)'
Добрый день. Делал по методички, и почему-то валятся ошибки... файл...

Как корректно скопировать vector в vector внутри класса
Есть класс принимающий в конструкторе vector: class test { ...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

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