Мне дают файл с (имена сотрудников | город, в котором они находятся) и другой файл (имена сотрудников | зарплаты). Программа спрашивает пользователя о городе. Я читаю в каждом файле мультикарту, а затем читаю сотрудников из определенного города (ключ) в набор и перебираю набор (для l oop), и у меня есть вложенное значение для l oop, перебирающее карту и распечатка сотрудника: зарплата, если установленный итератор == итератор карты. У меня возникли проблемы с получением всех выходных данных, которые я должен, однако. Например, если я набираю «Воск», печатается «Джошуа Хаммер» и переходит к «Джошуа Харцек» без печати «Джошуа Хаманн». Кроме того, для города, Nonesuch, я не получаю выходной, но я должен получить 3 имени и зарплаты. Для Луисвилла я получаю 3341 имя и зарплату, но я получаю только 3 341, но я должен получить 13 562. Я не знаю, как добавить файлы сюда (мы можем добавить файлы), поэтому я готов отправить точные файлы, которые я читаю вам, по электронной почте.
File Snippet (Nonesuch)
Charles Linton|Nonesuch
Mark Holloway|Nonesuch
Wendy Warner|Nonesuch
% ./prog0.py Louisville | wc -l
13562
% ./prog0.py ville | wc -l
26888
% ./prog0.py Lexington | wc -l
13463
% ./prog0.py Nonesuch | wc -l
3
% ./prog0.py Lou | wc -l
54049
//This is C++
#include <fstream>
#include <iostream>
#include <map>
#include <string>
#include <set>
using namespace std;
int main()
{
string str;
cout << "Enter the location: ";
cin >> str;
ifstream addresses;
addresses.open("personnel_addresses.txt");
multimap<string, string>name_address;
ifstream salaries;
salaries.open("personnel_salaries.txt");
multimap<string, string>name_salary;
string name2address,name2employee, address, tmpstr1, tmpstr2, salary;
while(getline(addresses, tmpstr1) && getline(salaries, tmpstr2))
{
getline(addresses, tmpstr1);
int pos = tmpstr1.find("|");
name2address = tmpstr1.substr(0, pos);
address = tmpstr1.substr(pos+1);
name_address.insert({address, name2address});
getline(salaries, tmpstr2);
pos = tmpstr2.find("|");
name2employee = tmpstr2.substr(0, pos);
salary = tmpstr2.substr(pos+1);
name_salary.insert({name2employee, salary});
}
set<string>employees;
int k=0;
for(auto it = name_address.lower_bound(str); it != end(name_address) && it->first.compare(0, str.size(), str) ==0; it++)
{
employees.insert(it->second);
}
for (auto i = employees.begin(); i != employees.end(); i++)
{
// if(*i == "Joshua Hamann")
// cout << *i;
for(auto it = name_salary.begin(); it != name_salary.end(); it++)
{
if(*i == it->first)
{
cout << *i << ":" << it->second << "\n";
break;
// k++;
}
}
}
cout<<k;
addresses.close();
salaries.close();
return 0;
}
РЕДАКТИРОВАТЬ: Моя проблема была проста и была исправлена с помощью .begin () и .end () для перебора многоадресного name_address и поиска каждого имени с помощью .substr (). Также мое время l oop было неверным. Я должен был прочитать каждый файл отдельно друг от друга.
while(getline(addresses, tmpstr1))
{
int pos = tmpstr1.find("|");
string name2address = tmpstr1.substr(0, pos);
string address = tmpstr1.substr(pos+1);
name_address.insert({address, name2address});
}
while(getline(salaries, tmpstr2))
{
int pos = tmpstr2.find("|");
string name2employee = tmpstr2.substr(0, pos);
string salary = tmpstr2.substr(pos+1);
name_salary.insert({name2employee, salary});
}
for(auto it = name_address.begin(); it != name_address.end(); ++it)
{
for(int i = 0; i < it->first.length(); ++i)
{
string tmpstr3 = it->first.substr(0 + i, str.length());
if(str == tmpstr3)
{
employees.insert(it->second);
break;
}
}
}