Как реализовать istream& overloading в C++?


Я не могу получить этот код для вывода информации о файле. Как бы я использовал перегрузку ostream для вывода этого? Или я должен сделать это каким-то другим способом? Я не могу этого понять.

Какой алгоритм сортировки C++ лучше всего использовать для сортировки информации по возрастанию?

#include <iostream>
#include <fstream>
#include <sstream>
#include <string>
#include <stdlib.h> // needed to use atoi function to convert strings to integer

using namespace std;

struct Employees
{
   string employeeName;
   string employeeID;
   int rate;
   int hours;
};

istream& operator >> (istream& is, Employees& payroll)
{
    char payrollStuff[256];
    int pay = atoi(payrollStuff); // use atoi function to convert string to int

    is.getline(payrollStuff, sizeof(payrollStuff));
    payroll.employeeName = payrollStuff;

    is.getline(payrollStuff, sizeof(payrollStuff));
    payroll.employeeID = payrollStuff;

    is.getline(payrollStuff, sizeof(payrollStuff));
    payroll.rate = atoi(payrollStuff);

    is.getline(payrollStuff, sizeof(payrollStuff));
    payroll.hours = atoi(payrollStuff);

    return is;

};

int main()
{
    const int SIZE = 5; // declare a constant
    Employees payroll_size[5];

    ifstream myFile;
    myFile.open("Project3.dat");
    if(myFile.fail())            //is it ok?
   {
       cerr << "Input file did not open please check it" << endl;
   }
   else
   for (int i=0; i< 5; i++)
   {
       myFile >> payroll_size[i];
   }


   myFile.close();

   return 0;
}
1 2

1 ответ:

Просто перегрузите оператор так же, как вы это сделали для >>. Например:

ostream& operator<<(ostream& os, Employees& payroll)
{
    os << payroll.employeeName << " " << payroll.employeeID << " " << payroll.rate << " " << payroll.hours << "\n";
    return os;
}

Затем, в цикле, вы можете просто перебрать массив и распечатать каждый из Employees, используя <<.

На заметку, если вы проверяете, открыт ли файл, лучше использовать специальную функцию std::ifstream::is_open.

Для сортировки записей лучше всего использовать std::sort, с пользовательским предикатом для любых критериев, которые вы хотите отсортировать. В качестве примера, если вы хотите отсортировать по имени сотрудника в алфавитном порядке, вы бы использовали следующую команду:

sort(payroll_size, payroll_size + 5, [](const Employee& a, const Employee& b) { return a.employeeName < b. employeeName; });