给定位置子字符串时返回员工和薪水
Returning Employee and Salary when Given a Location Substring
我得到了两个文件,一个是人名和他们来自的位置 (Evan Lloyd|Brownsville),另一个是姓名和薪水 (Evan Lloyd|58697)(您找到的行号第一个文件中的员工不一定是第二个文件中找到员工的行号)。用户输入位置(全部或部分)。例如,如果他们输入 "ville" 或 "Ville",它应该包括 Brownsville、Clarksville、Greenville 等地的所有员工。我应该加入姓名和薪水,如果 return 他们他们在搜索的城市中,即 "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 循环中填充一个充满城市的集合,并在声明 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;
}
}
}
分段错误通常发生在您试图以某种容量访问内存,但没有访问该内存位置的权限时。我注意到在您的最后一个 for 循环中,您说 for(int i = 0; i < sizeof(employees); i++)
,但我相信函数 sizeof(object)
报告其参数正在消耗的内存字节数。这似乎不是您想要的,字节数很可能比您跟踪的员工数大得多。因此,for 循环的主体将尝试访问它不允许访问的内存,然后提示分段错误。
另一个快速注释:
你能保证你的两个输入文件都包含相同数量员工的信息吗?否则,由于循环条件,一旦读到 both 个文件,您将停止读取 both 个文件。
在大多数情况下,我认为 ifstream::eof()
是非常危险的,因为它只表明您是否试图读取文件末尾。这通常意味着您将执行比预期更多的操作。 See here如果你想从比我更有见识的人那里得到更多信息。
我得到了两个文件,一个是人名和他们来自的位置 (Evan Lloyd|Brownsville),另一个是姓名和薪水 (Evan Lloyd|58697)(您找到的行号第一个文件中的员工不一定是第二个文件中找到员工的行号)。用户输入位置(全部或部分)。例如,如果他们输入 "ville" 或 "Ville",它应该包括 Brownsville、Clarksville、Greenville 等地的所有员工。我应该加入姓名和薪水,如果 return 他们他们在搜索的城市中,即 "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 循环中填充一个充满城市的集合,并在声明 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;
}
}
}
分段错误通常发生在您试图以某种容量访问内存,但没有访问该内存位置的权限时。我注意到在您的最后一个 for 循环中,您说 for(int i = 0; i < sizeof(employees); i++)
,但我相信函数 sizeof(object)
报告其参数正在消耗的内存字节数。这似乎不是您想要的,字节数很可能比您跟踪的员工数大得多。因此,for 循环的主体将尝试访问它不允许访问的内存,然后提示分段错误。
另一个快速注释:
你能保证你的两个输入文件都包含相同数量员工的信息吗?否则,由于循环条件,一旦读到 both 个文件,您将停止读取 both 个文件。
在大多数情况下,我认为
ifstream::eof()
是非常危险的,因为它只表明您是否试图读取文件末尾。这通常意味着您将执行比预期更多的操作。 See here如果你想从比我更有见识的人那里得到更多信息。