работа с файлом в с++

390
07 июня 2017, 04:06

Я делаю курсач, суть задания создания сделать телефонный справочник. Суть проблемы: я хочу сделать что бы ФИО адрес и номер телефона находился в файле. но я не могу сделать так что бы в файле был поиск допустим только по номеру или только по адресу. например в файле есть строка Петров И.А ул. Центральная +74563643234 и допустим тут нужен поиск по номеру телефона. как мне это реализовать? мне нужно только разобраться как читать с файла

Answer 1

Вот вам заготовка:

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

class Row{
public:
    static const std::string DELIMITER;
    std::string name;
    std::string place;
    std::string phone;
    Row(const std::string& name, const std::string& place, const std::string& phone):
            name(name), place(place), phone(phone) {}
    Row(std::string src){
        this->name = src.substr(0, src.find(this->DELIMITER));
        src.erase(0, src.find(this->DELIMITER) + DELIMITER.length());
        this->place = src.substr(0, src.find(this->DELIMITER));
        src.erase(0, src.find(this->DELIMITER) + DELIMITER.length());
        this->phone = src;
    }
    std::string dump() const {
        std::stringstream buffer;
        buffer << this->name << this->DELIMITER << this->place << this->DELIMITER << this->phone;
        return buffer.str();
    }
    std::string __repr__() const {
        std::stringstream buffer;
        buffer <<  "Row(name=" << this->name << ",place=" << this->place << ",phone=" << this->phone << ")";
        return buffer.str();
    }
};

const std::string Row::DELIMITER = "|";

int main() {
    std::vector<Row> phonebook;
    std::string opt;
    while (true) {
        std::cout << "Input opt: "; std::cin >> opt;
        if (opt == "read") {
            phonebook.clear();
            std::string filename;
            std::cout << "    Input filename: "; std::cin >> filename;
            std::ifstream in_f(filename);
            if (in_f.is_open()) {
                std::string line;
                while (std::getline(in_f, line)) {
                    phonebook.push_back(Row(line));
                }
                in_f.close();
            } else {
                std::cerr << "        File is not open:" << filename << std::endl;
            }
            continue;
        }
        if (opt == "add") {
            std::string name;
            std::string place;
            std::string phone;
            std::cout << "    Input name: "; std::cin >> name;
            std::cout << "    Input place: "; std::cin >> place;
            std::cout << "    Input phone: "; std::cin >> phone;
            phonebook.push_back(Row(name, place, phone));
            continue;
        }
        if (opt == "find") {
            std::string field, value;
            std::cout << "    Input field: "; std::cin >> field;
            std::cout << "    Input value: "; std::cin >> value;
            for (const Row& row: phonebook) {
                if ((field == "name") && (row.name == value)) {
                    std::cout << "        " << row.__repr__() << std::endl;
                }
                if ((field == "place") && (row.place == value)) {
                    std::cout << "        " << row.__repr__() << std::endl;
                }
                if ((field == "phone") && (row.phone == value)) {
                    std::cout << "        " << row.__repr__() << std::endl;
                }
            }
            continue;
        }
        if (opt == "print") {
            for (const Row& row: phonebook) {
                std::cout << "    " << row.__repr__() << std::endl;
            }
            continue;
        }
        if (opt == "write") {
            std::string filename;
            std::cout << "    Input filename: "; std::cin >> filename;
            std::ofstream out_f(filename, std::ios_base::out);
            for (const Row& row: phonebook) {
                out_f << row.dump() << "\n";
            }
            out_f.close();
            continue;
        }
        if (opt == "break") {
            break;
        }
        std::cerr << "Opt is error:" << opt << std::endl;
    }
    return 0;
}
READ ALSO
Смена скорости COM-порта на ходу

Смена скорости COM-порта на ходу

Необходимость смены скорости на ходу возникла из-за требований к обратной совместимости системыКонтроллер работает на скорости 9600, и особый...

332
Сборка проекта Qt компилятором Intel C++ Compiler

Сборка проекта Qt компилятором Intel C++ Compiler

Здравствуйте! Имеется Qt 55

421
Jquery-ползунок с маркером

Jquery-ползунок с маркером

Подскажите, как добавить маркер к jqueryslider ?

359
responseText (AJAX) [требует правки]

responseText (AJAX) [требует правки]

Как запрашивать у файла не весь код, а только одну переменную? К примеру, нужно взять переменную $text из файлаНо responseText берет весь текст

290