我有一个txt文件,其中包含逗号分隔行中的name,id number,mobilenumber和location。 例 Robby,7890,7788992356,123 westminister 汤姆,8820,77882345,金斯敦路124号 我的任务是检索
按名称查找所有员工的信息。 按ID查找所有员工的信息。 添加员工的信息。 更新员工的信息。
到目前为止,我已阅读该文件并将信息存储在矢量中。代码如下所示。 对于任务 1)按名称查找所有员工的信息。我将迭代向量并打印包含名称的信息。我能够做到这一点 2)文本文件中的simialry我将查找id并打印有关它的信息。 但我对第3点和第3点毫无头绪4。
我在下面发布我的代码
void filter_text( vector<string> *words, string name)
{
vector<string>::iterator startIt = words->begin();
vector<string>::iterator endIt = words->end();
if( !name.size() )
std::cout << " no word to found for empty string ";
while( startIt != endIt)
{
string::size_type pos = 0;
while( (pos = (*startIt).find_first_of(name, pos) ) != string::npos)
std:cout <<" the name is " << *startIt<< end;
startIt++;
}
}
int main()
{
// to read a text file
std::string file_name;
std::cout << " please enter the file name to parse" ;
std::cin >> file_name;
//open text file for input
ifstream infile(file_name.c_str(), ios::in) ;
if(! infile)
{
std::cerr <<" failed to open file\n";
exit(-1);
}
vector<string> *lines_of_text = new vector<string>;
string textline;
while(getline(infile, textline, '\n'))
{
std::cout <<" line text:" << textline <<std::endl;
lines_of_text->push_back(textline);
}
filter_text( lines_of_text, "tony");
return 0;
}
答案 0 :(得分:1)
#include <string>
#include <iostream>
#include <vector>
#include <stdexcept>
#include <fstream>
struct bird {
std::string name;
int weight;
int height;
};
bird& find_bird_by_name(std::vector<bird>& birds, const std::string& name) {
for(unsigned int i=0; i<birds.size(); ++i) {
if (birds[i].name == name)
return birds[i];
}
throw std::runtime_error("BIRD NOT FOUND");
}
bird& find_bird_by_weight(std::vector<bird>& birds, int weight) {
for(unsigned int i=0; i<birds.size(); ++i) {
if (birds[i].weight< weight)
return birds[i];
}
throw std::runtime_error("BIRD NOT FOUND");
}
int main() {
std::ifstream infile("birds.txt");
char comma;
bird newbird;
std::vector<bird> birds;
//load in all the birds
while (infile >> newbird.name >> comma >> newbird.weight >> comma >> newbird.height)
birds.push_back(newbird);
//find bird by name
bird& namebird = find_bird_by_name(birds, "Crow");
std::cout << "found " << namebird.name << '\n';
//find bird by weight
bird& weightbird = find_bird_by_weight(birds, 10);
std::cout << "found " << weightbird.name << '\n';
//add a bird
std::cout << "Bird name: ";
std::cin >> newbird.name;
std::cout << "Bird weight: ";
std::cin >> newbird.weight;
std::cout << "Bird height: ";
std::cin >> newbird.height;
birds.push_back(newbird);
//update a bird
bird& editbird = find_bird_by_name(birds, "Raven");
editbird.weight = 1000000;
return 0;
}
显然不是员工,因为这样会使你的作业变得容易。
答案 1 :(得分:0)
首先将CSV行拆分为单独的字段,然后使用此数据填充结构
例如:
struct Employee
{
std::string name;
std::string id_number;
std::string mobilenumber;
std::string location;
};
std::vector<Employee> employees; // Note you dont need a pointer
查看字符串方法find_first_of,substr和friends。
答案 2 :(得分:0)
所以,首先,我认为你不应该将信息存储在字符串向量中。这种任务完全要求使用
struct employee {
int id;
std::string name;
std::string address;
//... more info
};
将员工实例存储在
中 std::vector<employee>
你看,使用你存储线路的策略,搜索“威斯敏斯特”会让我知道罗比,因为他的文字行确实包含了这个子串,但他的名字根本不是威斯敏斯特。将数据存储在员工结构的向量中可以消除这个问题,并且它会使整个事情变得更加结构化。
当然,您需要实际解析文件以将信息导入向量。我建议使用像:
这样的策略while(getline(infile, textline, '\n')) {
std::stringstream l(textline);
getline(l,oneEmp.name, ','); //extract his name using getline
l >> oneEmp.id; //extract his id
//extract other fields from the stringstream as neccessary
employees.push_back(oneEmp);
}
至于添加信息:当用户输入数据时,只需将其存储在员工矢量中;当你需要更新文件时,你可以简单地用一个新文件覆盖原始数据文件,打开它进行写入&amp;把数据倾倒在那里(这显然是一个相当浪费的策略,但它适用于学校作业(我认为这是学校作业))。