Мне дают два файла, один с именем человека и местом, откуда они (Эван Ллойд | Браунсвилл), и другой с именем и зарплатой (Эван Ллойд | 58697) (номер строки, на которой вы найдете сотрудника на в первом файле не обязательно указан номер строки, в которой находится сотрудник во втором). Пользователь вводит местоположение (полностью или частично). Например, если они вводят «ville» или «Ville», это должно включать всех сотрудников в Браунсвилле, Кларксвилле, Гринвилле и др. c. Я должен присоединиться к имени и зарплате и вернуть их, если они в городе искали, например, "ville" или "Ville".
У меня нет ошибок или предупреждений при компиляции, но я получаю ошибку сегментации для всех входных данных.
#include <fstream>
#include <iostream>
//#include <vector>
#include <string>
#include <bits/stdc++.h>
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;
while(!addresses.eof() && !salaries.eof()) {
string tmpstr;
getline(addresses, tmpstr);
int pos = tmpstr.find("|");
string name2address = tmpstr.substr(0, pos - 1);
string address = tmpstr.substr(pos + 1);
name_address.insert({address, name2address});
getline(salaries, tmpstr);
pos = tmpstr.find("|");
string name2employee = tmpstr.substr(0, pos - 1);
string salary = tmpstr.substr(pos + 1);
name_salary.insert({name2employee, salary});
}
// do{
vector<string> employees;
for(auto n = name_address.find(str); n != name_address.end(); n++) {
employees.emplace_back(n->second);
}
for(int i = 0; i < sizeof(employees); i++) {
string x = employees[i];
// if (name_salary.find(employees[i]))
cout << employees[i] << ":" << name_salary.find(x)->second << "\n";
}
//}while(name_address.end());
addresses.close();
salaries.close();
return 0;
}
Кто-то рекомендовал мне изменить код, заполнив набор, полный городов в while l oop и итерацию по множеству сразу после объявления vectoremployees вместо кода, который находится непосредственно под ним с помощью следующего кода
for(string const& search : cities)
{
if(find(search.begin(), search.end(), str) != std::string::npos)
{
string y = search;
employees.emplace_back(y);
, но что-то не так с синтаксисом, где я пытаюсь выполнить итерацию the set.
РЕДАКТИРОВАТЬ: Моя проблема была проста и была решена с помощью .begin () и .end (), чтобы перебрать имя-адрес мультикарты и найти каждое имя с помощью .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;
}
}
}