2016-11-27 4 views
-3

Этот код должен считываться из файла и хранить информацию. Вот файл:Использование структур и указателей

5 
Franks,Tom 2 3 8 3 6 3 5 
Gates,Bill 8 8 3 0 8 2 0 
Jordan,Michael 9 10 4 7 0 0 0 
Bush,George 5 6 5 6 5 6 5 
Heinke,Lonnie 7 3 8 7 2 5 7 

сейчас я просто сосредоточен на сохранении указателей на имена. Вот код, который у меня есть до сих пор (игнорируйте другие функции, которые я еще не получил). Мне нужно сохранить имена, используя сотрудников [row] = new Employee; и fin >> employees [row] -> names; и я просто не знаю, как это сделать.

#include "stdafx.h" 
#include <iostream> 
#include <fstream> 
#include <string> 
#include <iomanip> 
#include <vector> 

using namespace std; 

struct Employee { 
string names; 
vector<int> data; 
int totalHrs; 
}; 


int fillAndTotal(vector<Employee *>&employees); 
void sort(vector<Employee *>&employees, int amount); 
void output(vector<Employee *>&employees, int amount); 



int main() 
{ 
vector<Employee *>employees; 
//vector<string>names; 
int amount = 0; 


amount = fillAndTotal(employees); 

sort(employees, amount); 

output(employees, amount); 


system("pause"); 
return 0; 

} 

int fillAndTotal(vector<Employee *>&employees) { 

int const TTL_HRS = 7; 
ifstream fin; 
fin.open("empdata.txt"); 

if (fin.fail()) { 
    cout << "ERROR"; 
} 

int sum = 0; 
int numOfNames; 
fin >> numOfNames; 
string tmpString; 
int tempInt = 0; 

vector<int>temp(8); 

for (int row = 0; row < numOfNames; row++) { 

    employees[row] = new Employee; 

    fin >> employees[row]->names; 
+2

«Я не знаю, как это сделать», это не вопрос. До конца вопрос заключается в следующем: «прочитайте свою книгу на C++ и следуйте приведенным в ней примерам для чтения и обработки из« std :: cin », а также для использования и управления векторами и структурами». –

+0

@SamVarshavchik Я пробовал это. Я прочитал лекционные слайды, раздел учебника, и я уже возился с кодом за последние полтора часа. Я не буду здесь искать прямой ответ, но небольшая помощь будет приятной. – Ralf

+0

Когда вы прочитали раздел учебника, в котором описывается, как использовать 'std :: vector', как именно объяснил этот раздел вашего учебника, нужно идти о добавлении новых значений в вектор? Это не может быть так, как вы это делаете (или не делаете) здесь. Начните с этой задачи: правильное добавление новых значений в вектор. Если вы не можете этого сделать, забудьте о заполнении фактического содержимого объекта. –

ответ

0

Во-первых, для этого вам не нужны указатели - структура вашего сотрудника совершенно безопасна для хранения в векторе.

Во-вторых, при чтении данных, ориентированных на линию, очень легко выйти из-под контроля и позволить вашим чтениям перетекать в следующую строку или нижестое, и вы не выполняете достаточное количество прочтений для строки - то, что я делаю, напишите функцию, которая читает целую строку за раз и возвращает строковый поток, содержащий только эту строку, тогда я делаю свои отдельные чтения на этом строковом потоке.

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

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

struct Employee 
{ 
    std::string names; 
    std::vector<int> data; 
    int totalHrs; 
}; 
using EmpList = std::vector<Employee>; 

int fillAndTotal(EmpList& employees); 
std::stringstream readRowData(std::istream& fin); 

#ifndef NDEBUG 
// Debug - dump to stream. 
std::ostream& operator<<(std::ostream& out, const Employee& employee); 
std::ostream& operator<<(std::ostream& out, const EmpList& employees); 
#endif 

int main(int argc, char* argv[]) 
{ 
    EmpList employees; 

    auto grandTotal = fillAndTotal(employees); 
    std::cout << employees; 
    std::cout << "\nGrand total hours: " << grandTotal << std::endl; 
} 

int fillAndTotal(EmpList& employees) 
{ 
    auto fin = std::ifstream("empdata.txt"); 

    auto rowCount = 0; 
    auto rowData = readRowData(fin); 
    rowData >> rowCount; 

    auto totalHours = 0; 
    for (auto i = 0; i < rowCount; ++i) 
    { 
     rowData = readRowData(fin); 
     if (!fin.eof()) 
     { 
      auto employee = Employee{}; 

      rowData >> employee.names; 

      int hours; 
      while (rowData >> hours) 
      { 
       if (hours != 0) 
       { 
        employee.data.push_back(hours); 
        employee.totalHrs += hours; 
        totalHours += hours; 
       } 
      } 

      employees.push_back(employee); 
     } 
    } 
    return totalHours; 
} 

std::stringstream readRowData(std::istream& fin) 
{ 
    std::stringstream rowStream; 
    std::string rowData; 
    if (getline(fin, rowData)) 
    { 
     rowStream.str(rowData); 
    } 
    return rowStream; 
} 

#ifndef NDEBUG 
std::ostream& operator<<(std::ostream& out, const Employee& employee) 
{ 
    out << "Name: " << employee.names << '\n'; 
    out << "Total hours: " << employee.totalHrs << '\n'; 
    out << "Individual hours:"; 
    for (auto const &hours : employee.data) 
    { 
     out << ' ' << hours; 
    } 
    out << std::endl; 
    return out; 
} 

std::ostream& operator<<(std::ostream& out, const EmpList& employees) 
{ 
    auto first = true; 
    for (auto const &employee : employees) 
    { 
     if (first) 
     { 
      first = false; 
     } 
     else 
     { 
      out << '\n'; 
     } 
     out << employee; 
    } 
    return out; 
} 
#endif 

Теперь ваша функция вывода уже написана для вас, и вам просто нужно написать свой вид.