从具有两列的文件中加载二维阵列

Load 2D array from a file with two columns

本文关键字:加载 阵列 二维 文件 两列      更新时间:2023-10-16

我正试图从payroll.dat:输入此数据

40.0     10.00
38.5      9.50
16.0      7.50
42.5      8.25
22.5      9.50
40.0      8.00
38.0      8.00
40.0      9.00
44.0     11.75

放入类payroll对象的二维数组中。

以下是我错误尝试的内容:

int count = 0;
const int numEmploy = 7;            // Number of employees
const int col = 2;                  // Number of categories
Payroll empData[numEmploy][col];    // Array to hold objects
ifstream inputFile;
    inputFile.open("payroll.dat");
    if (!inputFile)
        cout << "There was an error opening the file. Please make sure it exists." << endl;
    else
    {
        while(count < numEmploy && inputFile >> empData[][])
        {
            inputFile >> empData[count][0] >> empData[count][1];
            count++;
        }
    }

最终,我需要取payroll.dat[0][0]位置的值,然后乘以[0][1][1][0]*[1][1][2][0]*[2][1]等,并将结果显示为总薪酬。

我想我对>>运算符的理解是错误的。在这种情况下,这是流提取,按位提取,还是技术上两者都有?

我对正在发生的事情的理解是:只要count小于numEmploy,并且empData[][]正在从payroll.dat接收值,就将payroll.dat中的第一个可用数据块插入empData[0][0],将第二个块(第一个块右侧的块)插入empData[0][1]。然后循环返回并将下面的块(payroll.dat的下一行、第一列)插入empData[1][0],然后将右边的块插入empData[1][1]。继续此操作,直到count大于或等于numEmploy。则每个CCD_ 21将是类别CCD_ 22的对象。至少这是我想要的:P

有可能做到这一点吗?还是我一直在使用两个不同的数组?

这是我到目前为止的全部代码:

class Payroll
{
    private:
        double payRate;      // holds an employee hourly pay rate
        double hoursWorked;  // an employee's hours worked
    public:
        Payroll()  // empty constructor sets the payRate and hoursWorked to zero
        {
            payRate = hoursWorked = 0;
        }
        Payroll(double payR, double hoursW) //constructor checks for payR and hoursW to be positive
                    // and sets payRate and hours worked; sets to zero if negative values are provided
        {
            if (payR < 0) payR = 0;
            if (hoursW < 0) hoursW = 0;
        }
        void setPayRate(double payR) //mutator for payRate; checks for payR to be positive or sets to zero
        {
            payRate = payR;
        } 
        void setHoursWorked(double hoursW) //mutator for hoursWorked; checks for positive hoursW or sets to zero
        {
            hoursWorked = hoursW;
        }
        double getPayRate() //accessor to return payRate
        {
            return payRate;
        }
        double getHoursWorked() // accessor to return hoursWorked
        {
            return hoursWorked;
        }
        double getGrossPay() // computes and returns gross pay including OVERTIME, if any
        {
            float normHours, overHours, grossPay;
            if (hoursWorked > 40)
            {
                overHours = (hoursWorked - 40);
                normHours = (hoursWorked - overHours);
                grossPay = (overHours * payRate * 1.5) + (normHours * payRate);
            }
            return grossPay;
        }
};


int main ()
{
int count = 0;
const int numEmploy = 7;            // Number of employees
const int col = 2;                  // Number of categories
Payroll empData[numEmploy][col];    // Array to hold objects
ifstream inputFile;
inputFile.open("payroll.dat");
if (!inputFile)
    cout << "There was an error opening the file. Please make sure it exists." << endl;
else
{
    while(count < numEmploy && inputFile >> empData[][])
    {
        inputFile >> empData[count][0] >> empData[count][1];
        count++;
    }
}
inputFile.close();
cout << fixed << showpoint << setprecision(2) << endl;
cout << "Employees' gross pay:" << endl;
for (int index = 0; index < numEmploy; index++)
{
    empData[index][2].setPayRate();
    empData[index][1].setHoursWorked();
    cout << "Employee # " << index + 1 << empData.getGrossPay();
}

    return 0;
}

我想你想要更像这样的东西,

Payroll empData[numEmploy] ;
...
while ( count < numEmploy )
{
  inputFile >> empdata[count].payRate >> empdata[count].hoursWorked ;
  count ++ ;
}

那么你的工资只是empdata[x].payRate * empdata[x].hoursworked

如果读取循环不在Payroll的成员函数中,那么您必须使用setters:

while ( count < numEmploy )
{
  double tmppay, tmphours ;
  inputFile >> tmppay >> tmphours ;
  empdata[count].setPayRate( tmppay ) ;
  empdata[count].setHoursWorked( tmphours) ;
  count ++ ;
}