Поиск сотрудников и распечатка их зарплаты из текстовых файлов - PullRequest
0 голосов
/ 30 января 2020

Мне дают файл с (имена сотрудников | город, в котором они находятся) и другой файл (имена сотрудников | зарплаты). Программа спрашивает пользователя о городе. Я читаю в каждом файле мультикарту, а затем читаю сотрудников из определенного города (ключ) в набор и перебираю набор (для 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;
            }
        }
    }   
...