如何使用C ++ STL HOmework操作txt文件

时间:2011-10-13 00:08:05

标签: c++ stl

我有一个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;
}

3 个答案:

答案 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;把数据倾倒在那里(这显然是一个相当浪费的策略,但它适用于学校作业(我认为这是学校作业))。