как манипулировать TXT-файлом с помощью C ++ STL HOmework - PullRequest
1 голос
/ 13 октября 2011

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

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

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

1 голос
/ 13 октября 2011
#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;
}

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

0 голосов
/ 13 октября 2011

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

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

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

0 голосов
/ 13 октября 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...