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

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

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

Заполнить контейнер map и vector данными из файла - C++

06.12.2012, 15:16. Просмотров 3639. Ответов 7

Текстовый файл содержит в себе информацию о пяти лифтах в виде:
12 900 first
10 600 second
15 700 third
20 1000 fourth
16 800 fifth
первое число-максимальный этаж, второе - максимальный вес, а слово - это название лифта.
Нужно считать эти данные , пользуясь библиотекой <fstream>,в контейнеры map и vector. Контейнер vector должен быть внутри map, т.е. ключ это название лифта, а значение(максимальный этаж и вес) содержит в себе vector.
Затем все вывести на экран. Вот мои наработки:
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
#include <iostream>
#include <fstream>
#include <string>
#include <map>
#include <vector>
#include <iterator>
using namespace std;
int main(int argc,char*argv[])
{
    if (argc!=2)
    {
        cout<<"wrong format"<<endl;
        return -2;
    }
    
    
    map <string,vector<pair<int,int>>> Lift;
    vector<pair<int,int>> Section; 
 
    string lift_name;
    int floor,weight;
    map <string,vector<pair<int,int>>>::iterator m;
    vector<pair<int,int>>::iterator v;
    ifstream stream(argv[1]);
    if (!stream)
    {
        cout<<"error open file"<<endl;
        return -1;
    }
 
    
    while(!stream.eof())
    {
        
 
 
        for(v=Section.begin(); v!=Section.end(); ++v)
        {
            stream>>floor>>weight>>lift_name;
            Section.push_back(pair <int,int> (floor,weight));
            cout<<v->first<<" "<<v->second<<endl;
            
        }
 
        
 
 
        }
    stream.close();
    
    
    
    return 0;
}
Код компилируется, ошибок никаких не вылетает, но при отладке вылетает пустое черное окно, не могу понять, в чем тут дело?..И еще не могу понять как записать в map считанное значение имени лифта и заполненный vector. строка
C++
1
Lift.insert(lift_name);
дает ошибку при отладке.
строка
C++
1
Lift.insert(lift_name,pair<int,int> (floor,weight));
так же дает ошибку
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.12.2012, 15:16
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Заполнить контейнер map и vector данными из файла (C++):

Не получается заполнить vector данными - C++
У меня в dll есть следующий класс. В main я пытаюсь создать вектор и заполнить его данными, обратившись к методам класса из длл. Данные я...

Чтение из файла в контейнер map - C++
Вот есть структура struct Kino { int numb ; //номер кинотеатра string name; //название ктра vector&lt;string&gt; sv; //список...

STL. Создать объект-контейнер stack и заполнить его данными типа double - C++
Задание: 1. Создать объект-контейнер и заполнить его данными, тип которых определяется вариантом задания. 2. Посмотреть контейнер. 3....

Задача по STL (Создать объект-контейнер, очередь с приоритетом, заполнить ее данными, тип char) - C++
Помогите,пожалуйста, заранее спасибо)) Вот задание: 1. Создать объект-контейнер, очередь с приоритетом, заполнить ее данными, тип...

Как положить строку из файла в контейнер vector - C++
Нужно считать строки из файла, и все строки, начинающиеся на &quot;a, c, e...&quot; в контейнер vector положить, а другие строки на &quot;b, d, f...&quot; в...

Обращение к элементам vector, который находится в map, находящийся в map - C++
Всем добрый день! Имеется такой контейнер. Как обращаться к элементам вектора и как пушбэчить его? map &lt;int,map&lt;int,vector&lt;int&gt; &gt;...

7
igorrr37
1648 / 1276 / 133
Регистрация: 21.12.2010
Сообщений: 1,932
Записей в блоге: 7
06.12.2012, 23:55 #2
вместо вектора пар можно взять пару
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
#include <iostream>
#include <string>
#include <utility>
#include <map>
#include <fstream>
#include <iomanip>
 
int main()
{
    std::ifstream ifs("in.txt");
    if(ifs.is_open())
    {
        std::map<std::string, std::pair<size_t, size_t>> map;
        std::string name;
        size_t floor, weight;
        while(ifs >> floor >> weight >> name)
        {
            map.insert(std::make_pair(name, std::make_pair(floor, weight)));
        }
        for(auto const& pair : map)
        {
            std::cout << std::setw(15) << std::left << pair.first << std::setw(6) << pair.second.first << pair.second.second << std::endl;
 
        }
        ifs.close();
    }
    else
        std::cerr << "Unable to open input file" << std::endl;
    return 0;
}
0
Beta
0 / 0 / 0
Регистрация: 06.12.2012
Сообщений: 9
07.12.2012, 22:11  [ТС] #3
согласна, но мне нужно именно, чтоб вектор был, либо list, но все равно, вам большое спасибо.
0
MrGluck
Модератор
Эксперт CЭксперт С++
7488 / 4603 / 691
Регистрация: 29.11.2010
Сообщений: 12,588
07.12.2012, 22:28 #4
Как вариант еще
C++
1
map[name] = {floor, weight};
0
gray_fox
What a waste!
1521 / 1226 / 70
Регистрация: 21.04.2012
Сообщений: 2,565
Завершенные тесты: 3
07.12.2012, 22:34 #5
Цитата Сообщение от Beta Посмотреть сообщение
Контейнер vector должен быть внутри map, т.е. ключ это название лифта, а значение(максимальный этаж и вес) содержит в себе vector.
Глупость какая-то. Так?
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
#include <iostream>
#include <fstream>
#include <vector>
#include <map>
#include <string>
#include <utility>
#include <limits>
#include <cstdlib>
 
 
int main(int argc, char * argv[]) {
   if (argc != 2) {
      std::cerr << "Invalid argument(s). Filename expected." << std::endl;
      return EXIT_FAILURE;
   }
   
   std::ifstream ifs(argv[1]);
   if (!ifs) {
      std::cerr << "Could not open file '" << argv[1] << "' for reading." << std::endl;
      return EXIT_FAILURE;
   }
 //  std::istream & ifs = std::cin;
 
   typedef std::map<std::string, std::vector<int> >     map_type;
   map_type lifts;
   
   while (ifs) {
      int maxFloor;
      int maxWeight;
      std::string name;
 
      ifs >> maxFloor>> maxWeight >> name;
      ifs.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
      
      std::vector<int> data;
      data.reserve(2);
      data.push_back(maxFloor);
      data.push_back(maxWeight);
 
      lifts.insert(std::make_pair(name, data));
   }
 
   for (map_type::const_iterator it = lifts.begin(); it != lifts.end(); ++it) {
      std::cout << it->second[0] << '\t' << it->second[1] << '\t' << it->first << std::endl;
   }
}
http://ideone.com/IqPDJU
1
Beta
0 / 0 / 0
Регистрация: 06.12.2012
Сообщений: 9
07.12.2012, 23:04  [ТС] #6
большое спасибо! все именно так как надо.

Добавлено через 1 минуту
только немного не понятно, что вот эта вот строчка делает:
C++
1
ifs.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
0
gray_fox
What a waste!
1521 / 1226 / 70
Регистрация: 21.04.2012
Сообщений: 2,565
Завершенные тесты: 3
07.12.2012, 23:14 #7
Цитата Сообщение от Beta Посмотреть сообщение
что вот эта вот строчка делает:
Пропустить все символы в потоке до конца строки. Так то она здесь наверное не особо нужна, по привычке пишу)
0
Beta
0 / 0 / 0
Регистрация: 06.12.2012
Сообщений: 9
07.12.2012, 23:40  [ТС] #8
Цитата Сообщение от gray_fox Посмотреть сообщение
Пропустить все символы в потоке до конца строки. Так то она здесь наверное не особо нужна, по привычке пишу)
понятно) но она нужна, без нее вывод на экран не совсем корректный.
без нее на экран выводится:
16 800
16 800 fifth
12 900 first
20 1000 fourth
10 600 second
15 700 third
0
07.12.2012, 23:40
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.12.2012, 23:40
Привет! Вот еще темы с ответами:

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

Заполнить массив структур данными с файла - C++
Описать структуру с именем WORKER, содержащую следующие поля: ФИО работника; название занимаемой должности; год поступления на работу....

Заполнить структуру данными из бинарного файла - C++
Мне нужно заполнить структуру Note данными из бинарного файла. У меня есть такие структуры: struct Name { string First_Name;//имя ...

Контейнер map ? - C++
Не совсем удается разобраться Не удается разобраться с ассоциативными контейнерами ! Как выглядит объявление функции в псевдокоде? Что...


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

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

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