как управлять txt-файлом с помощью C STL Домашнее задание

#c #stl

#c #stl

Вопрос:

У меня есть текстовый файл, который содержит имя, идентификационный номер, номер мобильного телефона и местоположение в строке, разделенной запятыми. пример Робби, 7890,7788992356, 123 вестминстер Том, 8820, 77882345, 124 Кингстон-роуд Моя задача — извлечь

Найдите всю информацию о сотруднике по имени. Найдите всю информацию о сотруднике по идентификатору. Добавьте информацию о сотруднике. Обновите информацию о сотруднике.

До сих пор я прочитал файл и сохранил информацию в векторе. Код показан ниже. Для заданий 1) Найдите всю информацию о сотруднике по имени. Я выполню итерацию в векторе и выведу информацию, содержащую имя . Я смогу это сделать 2) аналогично в текстовом файле я буду искать идентификатор и печатать информацию об этом. НО я ничего не знаю о пунктах 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 filen";
    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;
}
  

Комментарии:

1. Здесь много незавершенных предложений и идей.

2. Как насчет разметки каждой строки (разделение через запятую) и сохранения результата в a std::map<int, other_data> ?

3. Если это домашнее задание, пожалуйста, добавьте homework тег.

4. Я собирался предложить vector struct вариант s. Это меньший шаг по сравнению с тем, что у него есть сейчас.

Ответ №1:

 #include <string>
#include <iostream>
#include <vector>
#include <stdexcept>
#include <fstream>

struct bird {
    std::string name;
    int weight;
    int height;
};

birdamp; find_bird_by_name(std::vector<bird>amp; birds, const std::stringamp; 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");
}

birdamp; find_bird_by_weight(std::vector<bird>amp; 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
    birdamp; namebird = find_bird_by_name(birds, "Crow");
    std::cout << "found " << namebird.name << 'n';
    //find bird by weight
    birdamp; 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
    birdamp; editbird = find_bird_by_name(birds, "Raven");
    editbird.weight = 1000000;

    return 0;
}
  

Очевидно, не сотрудники, потому что это сделало бы вашу домашнюю работу слишком легкой.

Комментарии:

1. Спасибо, Дак, что помог мне. Но мне просто интересно, будет ли функция find_bird_by_name работать, если у меня есть несколько записей с одинаковыми именами, и я хочу получить всю информацию с одинаковым именем

2. Хандра, я закодировал его, чтобы найти только первое совпадение. Чтобы вернуть multiple, ему нужно будет создать a std::vector<bird> и push_back все bird совпадающие s, а затем вернуть это vector .

3. Спасибо, я решил проблему. Большое спасибо всем за помощь

Ответ №2:

Итак, во-первых, я не думаю, что вам следует хранить информацию в виде вектора строк. Такого рода задача полностью требует использования

 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);
}
  

Что касается добавления информации: когда пользователь вводит данные, просто сохраните их в своем векторе employees; и когда вам потребуется обновить файл, вы можете просто перезаписать исходный файл данных новым, открыв его для записи и сброса данных туда (это, очевидно, довольно расточительная стратегия, но это нормально для школьного задания (я полагаю, это школьное задание)).

Ответ №3:

Начните с разделения строки 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 .