【发布时间】:2020-05-12 07:37:05
【问题描述】:
我有两个文件,一个是人名和他们来自的位置 (Evan Lloyd|Brownsville),另一个是姓名和薪水 (Evan Lloyd|58697)(您找到员工的行号在第一个文件中不一定是在第二个文件中找到员工的行号)。用户输入位置(整体或部分)。例如,如果他们输入“ville”或“Ville”,它应该包括 Brownsville、Clarksville、Greenville 等地的所有员工。如果他们在搜索的城市中,我应该加入姓名和薪水并返回他们“维尔”或“维尔”。
编译时我没有错误或警告,但我得到所有输入的分段错误。
#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 循环中填充一组充满城市的代码来更改代码,并在声明 vectoremployees 后立即迭代该集合,而不是通过以下代码直接在它下面的代码
for(string const& search : cities)
{
if(find(search.begin(), search.end(), str) != std::string::npos)
{
string y = search;
employees.emplace_back(y);
,但是我尝试迭代集合的语法有问题。
编辑:我的问题很简单,并通过使用 .begin() 和 .end() 迭代多映射 name_address 并使用 .substr() 查找每个名称来解决。我的while循环也不正确。我应该分别阅读每个文件。我的解决方案中没有使用向量。
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;
}
}
}
【问题讨论】:
-
如果提供代码会有所帮助。
-
如何正确格式化它?我试图粘贴代码,但它们都在运行。
-
将代码从 IDE 复制到问题中。选择它并使用 {} 按钮形成一个代码块
-
我想提供帮助,但防火墙阻止我跟踪代码链接。
标签: c++ vector getline multimap