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

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

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

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

25.01.2012, 15:15. Просмотров 1341. Ответов 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>
Посмотрите здесь:

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

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

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

Bind vector<vector<A*>> - C++
Привет всем ! вот код struct A { void qwer(int a) { qDebug()&lt;&lt;a; } }; int main(int argc, char...

Поиск в vector < vector <T> > - C++
есть двумерный массив vector &lt; vector &lt;double&gt; &gt; a(size, vector&lt;double&gt;(size, 0)); заполняем рандомом, надо найти индекс последнего...

vector<vector<double>> => 2 * vector<vector<double>> - C++
Здравствуйте. У меня следующий вопрос. Имеется двумерный массив, созданный через класс vector&lt;vector&lt;double&gt;&gt; и пусть последний столбец...

vector < vector < pair<int,int> > > g - C++
Подскажите как мне считать файл *.txt- 2 7 3 9 6 14 1 7 4 15 3 10 .................. где числа идут парами( (2,7),(3,9),(6,14) ) в...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Mayonez
380 / 272 / 21
Регистрация: 26.12.2009
Сообщений: 875
25.01.2012, 15:19     Проблема с <vector> #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  [ТС]     Проблема с <vector> #3
О, спасибо за первое замечание, я исправил, но все равно почему-то выкидывает, а по поводу
C++
1
ios::binary
я собрался написать архиватор по алгоритму Хаффмана, а там же надо учитывать все символы
Mayonez
380 / 272 / 21
Регистрация: 26.12.2009
Сообщений: 875
25.01.2012, 15:30     Проблема с <vector> #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  [ТС]     Проблема с <vector> #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     Проблема с <vector> #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  [ТС]     Проблема с <vector> #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     Проблема с <vector> #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  [ТС]     Проблема с <vector> #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
Эксперт С++
4933 / 2513 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
26.01.2012, 11:53     Проблема с <vector> #10
hu2, ifstream по-умолчанию in. ofstream по-умолчанию out. Изначальная ошибка была в выходе за границу массива, о чем любезно сообщалось в assertion. Метод at() бросает соответствующее исключение, которое Вы не отлавливаете. Неотловленное исключение всегда приводит к terminate.
hu2
0 / 0 / 0
Регистрация: 01.05.2011
Сообщений: 9
26.01.2012, 12:09  [ТС]     Проблема с <vector> #11
Цитата Сообщение от fasked Посмотреть сообщение
hu2, ifstream по-умолчанию in. ofstream по-умолчанию out. Изначальная ошибка была в выходе за границу массива, о чем любезно сообщалось в assertion. Метод at() бросает соответствующее исключение, которое Вы не отлавливаете. Неотловленное исключение всегда приводит к terminate.
Я это все прекрасно понял и благодарю за ответ, но без ios::in вся эта конструкция после прочтения символа из файла не переводит указатель на следующий, по крайней мере, в msvs2010
fasked
Эксперт С++
4933 / 2513 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
26.01.2012, 12:43     Проблема с <vector> #12
Цитата Сообщение от hu2 Посмотреть сообщение
Я это все прекрасно понял и благодарю за ответ, но без ios::in вся эта конструкция после прочтения символа из файла не переводит указатель на следующий, по крайней мере, в msvs2010
Ну хватит сказки то рассказывать. В идеале, эта конструкция должна была упасть после прочтения первого же символа из файла Код некорректен - как следствие работает не так как ожидается и ios::in здесь не при чем.
hu2
0 / 0 / 0
Регистрация: 01.05.2011
Сообщений: 9
26.01.2012, 13:20  [ТС]     Проблема с <vector> #13
Цитата Сообщение от fasked Посмотреть сообщение
Ну хватит сказки то рассказывать. В идеале, эта конструкция должна была упасть после прочтения первого же символа из файла Код некорректен - как следствие работает не так как ожидается и ios::in здесь не при чем.
Все так и есть она и падала после первого символа, я понял все свои ошибки, но все-таки попробуйте скомпилировать программу с ios::in и без него, если вы мне не верите, и посмотрите на результат

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

Добавлено через 2 минуты
get() просто будет читать первый символ файла, пока вручную не завершить прогу
Не знаю, что должна делать Ваша программа, но лично у меня после исправлений ошибок в циклах, она не зависает Вполне себе завершается и даже что-то выводит на экран.
hu2
0 / 0 / 0
Регистрация: 01.05.2011
Сообщений: 9
26.01.2012, 15:17  [ТС]     Проблема с <vector> #15
эх... для моего мелкомягкого компилятора это преступление ту строчку не написать
vetal10
35 / 35 / 5
Регистрация: 25.05.2010
Сообщений: 211
26.01.2012, 21:44     Проблема с <vector> #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;
}
isaak
102 / 39 / 9
Регистрация: 17.10.2010
Сообщений: 656
26.01.2012, 22:11     Проблема с <vector> #17
А почему компилятор ругается на

1 IntelliSense: identifier "ifstream" is undefined c:\users\администратор\documents\visual studio 2010\projects\c++\console\p1514\vector\vector\vector.cpp 12 1 Vector
Заранее огромное спасибо.
NoMasters
Псевдослучайный
1747 / 1090 / 71
Регистрация: 13.09.2011
Сообщений: 3,120
26.01.2012, 22:14     Проблема с <vector> #18
std::ifstream
isaak
102 / 39 / 9
Регистрация: 17.10.2010
Сообщений: 656
26.01.2012, 22:19     Проблема с <vector> #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
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.01.2012, 22:21     Проблема с <vector>
Еще ссылки по теме:

vector C++ - C++
Подскажите пожалуйста в чём ошибка?? Прогромма считывает слова, записывает в &quot;вектор&quot; и выводит этот вектор на экран. Компилятор VC++ 6.0...

vector - C++
vector &lt;int&gt; v; for (int i = 0; i &lt; 5; i++) { int temp; cin &gt;&gt; temp; v.push_back(temp); } можно как-нибудь по...

Vector - C++
Задача: удалит все 0 из вектора. Программа удаляет, но потом выкидывает ошибку... #include &lt;iostream&gt; #include &lt;vector&gt; #include...

vector - C++
допустим есть вектор vector &lt;pair &lt;vector &lt;int&gt;, int&gt; &gt; v вызываем функцию sort() sort(v.begin(), v.end()) как она сортирует?? ...

vector - C++
Объявляю двумерный массив следующим образом: vector&lt; vector &lt;int&gt; &gt; m_Mas; Как в таком случае нужно добавлять элементы и обращаться к...


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

Или воспользуйтесь поиском по форуму:
NoMasters
Псевдослучайный
1747 / 1090 / 71
Регистрация: 13.09.2011
Сообщений: 3,120
26.01.2012, 22:21     Проблема с <vector> #20
C++
1
while(!in.eof())
Yandex
Объявления
26.01.2012, 22:21     Проблема с <vector>
Ответ Создать тему
Опции темы

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