Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

Войти
Регистрация
Восстановить пароль
 
tramp_1-3
14 / 14 / 1
Регистрация: 13.10.2012
Сообщений: 432
#1

Почему не добавляется элемент в вектор? - C++

23.07.2013, 12:21. Просмотров 476. Ответов 8
Метки нет (Все метки)

продолжение этой темы, но с другой проблемой. Ошибка в программе, читающей файлы
Пишу программу, которая принимает произвольное количество файлов с записями на вход и в конечном счете выводит эти записи отсортированные в последний принятый файл. Это неокончательный вариант программы, тут я пытаюсь загнать все записи в один контейнер-вектор.
tempset заполняется нормально, но вот copy (lists.at (i).begin (), lists.at (i).end (), output); ничего не выдает, в чем дело?
Кликните здесь для просмотра всего текста
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
#include <iostream>
#include <algorithm>
#include <string>
#include <iterator>
#include <set>
#include <fstream>
#include <cstdlib>
#include <vector>
 
using std :: vector;
using std :: set;
using std :: cout;
using std :: cin;
using std :: string;
using std :: cerr;
using std :: ifstream;
using std :: ofstream;
 
int main (int argc, char * argv []) {
    if (argc == 1) {
        cerr << "Usage: files for input, last for output\n";
        exit (1);
    };
    ifstream in;
    ofstream out;
    int quantity = argc - 2;         //êîëè÷åñòâî ГґГ*éëîâ
    int * entries = new int [quantity];   //Г¬Г*Г±Г±ГЁГў, Гў êîòîðîì õðГ*Г*ГЁГІГ±Гї êîëè÷åñòâî Г§Г*ГЇГЁГ±ГҐГ© (ñòðîê) Гў ГЄГ*æäîì ГґГ*éëå
    for (int i = 0; i < quantity; i++)
        entries [i] = 0;
    char ch;
    for (int i = 0; i < quantity; i++) {    //ïîäñ÷¸ò êîëè÷åñòâГ* Г§Г*ГЇГЁГ±ГҐГ© Гў ГЄГ*æäîì ГґГ*éëå
        in.open (argv [i + 1]);
        while (in.get (ch))
            if ( in.peek () == '\n')
                entries [i]++;
        in.clear ();
        in.close ();
    };
    std :: ostream_iterator <string>  output (cout, "\n");
    vector <set <string> > lists (quantity);    //ГЄГ®Г*ГҐГ·Г*ûé Г¬Г*Г±Г±ГЁГў Г§Г*ГЇГЁГ±ГҐГ©
    for (int i = 0; i < quantity; i++) {        //ïðî÷èòГ*ГІГј ГўГ±ГҐ ГґГ*éëû, êðîìå ïåðâîãî ГЁ ïîñëåäГ*ГҐГЈГ®
        in.open (argv [i + 1]);                     //Гі âõîäГ*îãî argv [i] ГґГ*éëГ* entries[i - 1] ñòðîê
        set <string> tempset;                   //âðåìåГ*Г*ûé ñïèîê äëÿ õðГ*Г*ГҐГ*ГЁГї ГІГҐГЄГіГ№ГҐГЈГ® îáðГ*ГЎГ*òûâГ*åìîãî ГґГ*éëГ*
        for (int j = 0; j < entries[i]; j++) {  // ïðî÷èòГ*ГІГј ГўГ±ГҐ ñòðîêè argv [i] ГґГ*éëГ*            
            char items [100];       //âðåìåГ*Г*Г*Гї ñòðîêГ* äëÿ õðГ*Г*ГҐГ*ГЁГї ГІГҐГЄГіГ№ГҐГ© îáðГ*ГЎГ*òûâГ*åìîé ñòðîêè
            int it = 0;
            while (in.get (ch) && ch != '\n')
                items [it++] = ch;
            string tempstr (items);
            tempset.insert (tempstr);
        };
        //copy (tempset.begin (), tempset.end (), output);
        lists.push_back (tempset);
        copy (lists.at (i).begin (), lists.at (i).end (), output);
        in.clear ();
        in.close ();
    };
    copy (lists [0].begin (), lists [0].end (), output);
    system ("pause");
    return 0;
};
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.07.2013, 12:21
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Почему не добавляется элемент в вектор? (C++):

Почему матрица на вектор умножается быстрее чем вектор на матрицу? - C++
Почему матрица на вектор умножается быстрее чем вектор на матрицу?

Не добавляется элемент списка - C++
Первый элемент заполняется, после чего, нажав &quot;y&quot; в вопросе, продолжить дальше. Просто выводит подряд ве поля, которые нужно заполнить не...

В односвязный список добавляется последний нулевой элемент - C++
Здравствуйте, такая проблема, почему-то в список добавляется последний нулевой элемент, в чем может быть трабл ? скрин Вот...

Почему не инициализируется вектор размером 10? - C++
Хотел создать вектор размером 10, но visual studio выдаёт ошибку и при этом размер вектора равен 0, хотя я явно указал, что должно быть 10:...

Почему не сортируется вектор структур? - C++
Выводится ошибка c:\qtsdk\mingw\bin\..\lib\gcc\mingw32\4.4.0\include\c++\bits\stl_algo.h:89: error: passing 'const Task' as 'this' argument...

Почему этот вектор остаётся пустым? - C++
Есть такой класс: typedef std::vector &lt;lab_Arr_t *&gt; lab_Stack_t; /*...

8
alsav22
5426 / 4821 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
23.07.2013, 14:59 #2
Зачем вот это:
C++
1
 char items [100];
, если string используете? Если файл закрывется, то необязательно перед этим clear() делать.

Добавлено через 1 час 0 минут
Вот так попробуйте:
C++
1
vector <set <string> > lists;    //конечный массив записей
Добавлено через 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
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
#include <iostream>
#include <algorithm>
#include <string>
#include <iterator>
#include <set>
#include <fstream>
#include <cstdlib>
#include <vector>
 
using std :: vector;
using std :: set;
using std :: cout;
using std :: cin;
using std :: string;
using std :: cerr;
using std :: ifstream;
using std :: ofstream;
 
int main (int argc, char * argv []) {
    if (argc == 1) {
        cerr << "Usage: files for input, last for output\n";
        exit (1);
    };
    ifstream in;
    ofstream out;
    
    int quantity = argc - 1;         //количество файлов
    int * entries = new int [quantity];   //массив, в котором хранится количество записей (строк) в каждом файле
    for (int i = 0; i < quantity; i++)
        entries [i] = 0;
    string temp;
    for (int i = 0; i < quantity; i++) {    //подсчёт количества записей в каждом файле
        in.open (argv [i + 1]);
        while (getline(in, temp))
            entries [i]++;
        in.close ();
    };
    std :: ostream_iterator <string, char>  output (cout, "\n");
    
    vector <set <string> > lists;    //конечный массив записей
    for (int i = 0; i < quantity; i++) {        //прочитать все файлы, кроме первого и последнего
        in.open (argv [i + 1]);                     //у входного argv [i] файла entries[i - 1] строк
        set <string> tempset;                   //временный спиок для хранения текущего обрабатываемого файла
        for (int j = 0; j < entries[i]; j++) {  // прочитать все строки argv [i] файла            
            string items; //временная строка для хранения текущей обрабатываемой строки
            getline(in, items);
            tempset.insert (items);
        };
        //copy (tempset.begin (), tempset.end (), output);
        lists.push_back (tempset);
        copy (lists.at (i).begin (), lists.at (i).end (), output);
        in.close ();
    };
    
    copy (lists [0].begin(), lists [0].end(), output);
    
    system ("pause");
    return 0;
};
2
tramp_1-3
14 / 14 / 1
Регистрация: 13.10.2012
Сообщений: 432
24.07.2013, 05:34  [ТС] #3
Цитата Сообщение от alsav22 Посмотреть сообщение
Вот так попробуйте:
Полный приведеный вами листинг не робит (скорее всего количество строк не подсчитывается), но я сам исправил цикл и объявление, теперь он вот так выглядит и идеально работает
vector <set <string> > lists;
C++
1
2
3
4
5
6
        for (int j = 0; j < entries[i]; j++) {  // ïðî÷èòГ*ГІГј ГўГ±ГҐ ñòðîêè argv [i] ГґГ*éëГ*            
            string tempstr;
            while (in.get (ch) && ch != '\n')
                tempstr += ch;
            tempset.insert (tempstr);
        };
Спасибо большое!
0
alsav22
5426 / 4821 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
24.07.2013, 12:08 #4
Цитата Сообщение от tramp_1-3 Посмотреть сообщение
Полный приведеный вами листинг не робит (скорее всего количество строк не подсчитывается),
Да нет, там всё правильно подсчитывает. Если бы у меня не работал, то я бы не выложил код. Ваших файлов нет, чтобы проверить, может дело в этом.
0
alsav22
5426 / 4821 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
24.07.2013, 12:23 #5
Два файла: 11.txt и 12.txt.
11.txt:
aaa aaa
sss sss
ddd ddd
fff fff

12.txt:
vvv vvv
eee eee
rrr rrr

В конце последних строк: '\n'.
В командной строке ввожу: 500.exe 11.txt 12.txt
На скрине результат. По-моему, всё правильно отработало.
1
Миниатюры
Почему не добавляется элемент в вектор?  
Cmehotron
3 / 3 / 0
Регистрация: 02.05.2013
Сообщений: 35
24.07.2013, 15:24 #6
alsav22, а можно код показать, а то у меня таки с векторами ничего пока не фурычит
0
alsav22
5426 / 4821 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
24.07.2013, 15:27 #7
Цитата Сообщение от Cmehotron Посмотреть сообщение
а можно код показать
2 пост.
1
tramp_1-3
14 / 14 / 1
Регистрация: 13.10.2012
Сообщений: 432
24.07.2013, 20:35  [ТС] #8
Цитата Сообщение от alsav22 Посмотреть сообщение
Да нет, там всё правильно подсчитывает. Если бы у меня не работал, то я бы не выложил код. Ваших файлов нет, чтобы проверить, может дело в этом.
С файлами всё отлично, эту ошибку я исправил, прошу помочь с другой проблемой в этой же программе Вывод контейнера типа set <string> в файл
0
alsav22
5426 / 4821 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
24.07.2013, 22:47 #9
Нужны файлы и то, что вводите в командной строке.
0
24.07.2013, 22:47
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.07.2013, 22:47
Привет! Вот еще темы с ответами:

Почему вектор с типом определенным пользователем не выводиться на экран? - C++
народ короче я не могу вывести решение задачи на экран Была задача: Напишите программу, в которую сначала вводится набор пар, состоящих...

Глобальный вектор. Почему на выходе этот массив пуст? - C++
юзаю либу вектор. почему на выходе этот массив пуст? std::vector&lt;int&gt; qw;//global int main() { int i=1; qw.push_back(i); ...

Не получается вставить элемент в вектор - C++
Почему нельзя таким образом вставить элемент в вектор? #include &lt;vector&gt; using SomeVeryLongNamedType = int; int main() { ...

Почему при добавлении в вектор нового элемента capacity увеличивается с запасом? - C++
Почему vector.size() не всегда равен vector.capacity()? Можно же было в реализации вектора при добавлении нового элемента перераспределять...


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

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

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