#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 .