Хобрук: Ваш путь к мастерству в программировании

Ошибка с getline

Я получаю сообщение об ошибке, и не знаю почему, я очень новичок в С++, и если бы вы могли посмотреть на остальную часть моего кода, чтобы убедиться, что все в порядке, это было бы здорово.

Я получаю сообщение об ошибке в этих двух строках.

getline(in, e.first, ',');
getline(in, e.last, ',');

Он говорит, что класс Employee не имеет члена First, и я знаю, что это не в этой функции, как я могу это исправить?

Вот остальная часть моего кода.

#include <iostream>
#include <string>
#include <fstream>

using namespace std;

struct Person {
    string first;
    string last;
};

struct Address {
    string street;
    string city;
    string state;
    string zipcode;
};

struct Employee {
    Person name;
    Address homeAddress;
    int eid;
};

void readEmployee(istream& in, Employee& e);
void displayEmployee(ostream& out, const Employee& e);

int main(int argc, const char* argv[]) {
    Employee e[50];

    ifstream fin;
    ofstream fout;

    fin.open("employeesIn.txt");

    if (!fin.is_open()) {
        cerr << "Error opening employeesIn.txt for reading." << endl;
        exit(1);
    }
    fout.open("employeesOut.txt");
    if (!fout.is_open()) {
        cerr << "Error opening employeesOut.txt for writing." << endl;
        exit(1);
    }
    int EmployeePopulation = 0;
    readEmployee(fin, e[EmployeePopulation]);
    while (!fin.eof()) {
        EmployeePopulation++;
        readEmployee(fin, e[EmployeePopulation]);
    }
    fin.close();
    for (int i = 0; i <= EmployeePopulation - 1; i++) {
        displayEmployee(fout, e[i]);
    }

    fout.close();

    cout << endl;

    return 0;
}

void readEmployee(istream& in, Employee& e) {
    string cidText;
    if (getline(in, cidText, ',')) {
        e.eid = stoi(cidText);

        getline(in, e.first, ',');
        getline(in, e.last, ',');

        getline(in, e.homeAddress.street, ',');
        getline(in, e.homeAddress.city, ',');
        getline(in, e.homeAddress.state, ',');

        string zipcodeText;
        getline(in, zipcodeText, ',');
        e.homeAddress.zipcode = stoi(zipcodeText);
    }
}

  • Employee не имеет члена first. Person делает, но не Employee. 23.08.2014
  • Как бы вы порекомендовали исправить это с тем, что я пытаюсь сделать? 23.08.2014
  • Вам нужно сделать то же самое, что и с Address, к которому вы обращались через переменную-член homeAddress. В случае Person вам нужно добавить переменную-член .name (например: getline(in, e.name.first, ','); 23.08.2014
  • Я не понимаю, как вы могли правильно написать следующие три строки и до сих пор не знаете, что делать с этими двумя неправильными строками. Это то же самое, только с другим участником. Вы вообще написали этот код? 23.08.2014
  • Ах, большое спасибо, я забыл обо всей этой вложенности. 23.08.2014

Ответы:


1

Как насчет того, чтобы вместо этого переименовать структуру Person в структуру Name?
(она содержит только first и last< /strong> в конце концов.)
Это дало бы нам следующее:

struct Name {
    string first;
    string last;
}; 

Итак, как теперь выглядит сотрудник?
Он выглядит так:

+-------------+
|  Employee   |
|             |
| +---------+ |
| |  Name   | |
| +---------+ |
|             |
| +---------+ |
| | Address | |
| +---------+ |
|             |
+-------------+

Имя является частью слова Сотрудник, но где находится первый и последний? Они являются частью Имени.
Вот то же изображение, за исключением того, что оно идет глубже, чтобы показать вам первое и последнее:

+---------------+
|   Employee    |
|               |
| +-----------+ |
| |   Name    | |
| |           | |
| | +-------+ | |
| | | first | | |
| | +-------+ | |
| |           | |
| | +-------+ | |
| | | last  | | |
| | +-------+ | |
| |           | |
| +-----------+ |
|               |
|  +---------+  |
|  | Address |  |
|  +---------+  |
|               |
+---------------+

Вам нужно использовать ДВА оператора точки ('.') для доступа к first и last, потому что они ДВАЖДЫ глубже.

Employee e;
e.name.first = "Joe";

Ваш код был переработан, чтобы отразить эти изменения:

#include <iostream>
#include <string>
#include <fstream>

using namespace std;

struct Name {
    string first;
    string last;
};

struct Address {
    string street;
    string city;
    string state;
    string zipcode;
};

struct Employee {
    Name name;
    Address homeAddress;
    int eid;
};

void readEmployee(istream& in, Employee& e);
void displayEmployee(ostream& out, const Employee& e);

int main(int argc, const char* argv[]) {
    Employee e[50];

    ifstream fin;
    ofstream fout;

    fin.open("employeesIn.txt");

    if (!fin.is_open()) {
        cerr << "Error opening employeesIn.txt for reading." << endl;
        exit(1);
    }
    fout.open("employeesOut.txt");
    if (!fout.is_open()) {
        cerr << "Error opening employeesOut.txt for writing." << endl;
        exit(1);
    }
    int EmployeePopulation = 0;
    readEmployee(fin, e[EmployeePopulation]);
    while (!fin.eof()) {
        EmployeePopulation++;
        readEmployee(fin, e[EmployeePopulation]);
    }
    fin.close();
    for (int i = 0; i <= EmployeePopulation - 1; i++) {
        displayEmployee(fout, e[i]);
    }

    fout.close();

    cout << endl;

    return 0;
}

void readEmployee(istream& in, Employee& e) {
    string cidText;
    if (getline(in, cidText, ',')) {
        e.eid = stoi(cidText);

        getline(in, e.name.first, ',');
        getline(in, e.name.last, ',');

        getline(in, e.homeAddress.street, ',');
        getline(in, e.homeAddress.city, ',');
        getline(in, e.homeAddress.state, ',');

        string zipcodeText;
        getline(in, zipcodeText, ',');
        e.homeAddress.zipcode = stoi(zipcodeText);
    }
}
void displayEmployee(ostream& out, const Employee& e){

  //you can access the specific name values this way:
  cout <<  e.name.first << " " << e.name.last << endl;

  return;
}
23.08.2014
Новые материалы

Решения DBA Metrix
DBA Metrix Solutions предоставляет удаленного администратора базы данных (DBA), который несет ответственность за внедрение, обслуживание, настройку, восстановление базы данных, а также другие..

Начало работы с Блум
Обзор и Codelab для генерации текста с помощью Bloom Оглавление Что такое Блум? Некоторые предостережения Настройка среды Скачивание предварительно обученного токенизатора и модели..

Создание кнопочного меню с использованием HTML, CSS и JavaScript
Вы будете создавать кнопочное меню, которое имеет состояние наведения, а также позволяет вам выбирать кнопку при нажатии на нее. Финальный проект можно увидеть в этом Codepen . Шаг 1..

Внедрите OAuth в свои веб-приложения для повышения безопасности
OAuth — это широко распространенный стандарт авторизации, который позволяет приложениям получать доступ к ресурсам от имени пользователя, не раскрывая его пароль. Это позволяет пользователям..

Классы в JavaScript
class является образцом java Script Object. Конструкция «class» позволяет определять классы на основе прототипов с чистым, красивым синтаксисом. // define class Human class Human {..

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

Как построить любой стол
Я разработчик программного обеспечения. Я люблю делать вещи и всегда любил. Для меня программирование всегда было способом создавать вещи, используя только компьютер и мое воображение...


© 2024 hobruk.ru, Хобрук: Ваш путь к мастерству в программировании