Возврат сотрудника и зарплата при наличии подстроки местоположения - PullRequest
0 голосов
/ 26 января 2020

Мне дают два файла, один с именем человека и местом, откуда они (Эван Ллойд | Браунсвилл), и другой с именем и зарплатой (Эван Ллойд | 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;
            }
        }
    } 

1 Ответ

1 голос
/ 27 января 2020

Ошибка сегментации обычно возникает, когда вы пытаетесь получить доступ к памяти в некотором объеме, но у вас нет разрешения на это место в памяти. Я заметил, что в одном из ваших последних циклов for вы говорите for(int i = 0; i < sizeof(employees); i++), но я полагаю, что функция sizeof(object) сообщает количество байтов в памяти, которое потребляет ее параметр. Кажется, что это не то, что вы хотели, и число байтов, скорее всего, будет намного больше, чем количество сотрудников, которые вы отслеживаете. Таким образом, тело вашего for-l oop попытается получить доступ к памяти, к которой у него нет доступа, и затем выдаст ошибку сегментации.

Еще одна быстрая пара замечаний:

  1. Гарантируете ли вы, что оба ваших входных файла будут содержать информацию об одном и том же количестве сотрудников? Если нет, вы прекратите чтение из обоих файлов, как только дойдете до конца одного из них из-за состояния зацикливания.

  2. В большинстве случаев я считаю ifstream::eof() довольно опасным, поскольку он указывает только на то, пытались ли вы прочитать файл за концом файла. Обычно это означает, что вы будете выполнять больше операций, чем предполагали. Смотрите здесь , если вы хотите получить больше информации от более знающих людей, чем я.

...