0

我在这里做错了什么?当我发送这个我得到完全空白的文件?我需要重新处理数组还是该函数实际上没有向文件发送任何内容?这是家庭作业,所以有用的提示会很棒。我在这里很困惑,所以非常需要帮助。

Main- #include<iostream>
#include<fstream>
#include<string>
#include "Payroll.h"
using namespace std;


const int NUM_EMPLOYEE = 75;

int main()
{
    int dependents;
    double payrate;
    string name;
    double hours;
    ifstream fin;
    int count = 0;
    Payroll employeeArray[NUM_EMPLOYEE];
    ofstream fout;

    fin.open("employeeData.txt");

    if (!fin)
    {
        cout << "Error opening data file\n";
        return 0;
    }
    else
    {
        while(fin >> payrate >> dependents)
        {
            getline(fin, name);
            employeeArray[count].setWage(payrate);
            employeeArray[count].setDependents(dependents);
            employeeArray[count].setName(name);
            cout << "How many hours has" << name << " worked? ";
                cin >> hours;
                employeeArray[count].setHours(hours);
            count++;
        }

    }
    fout.open("payrollDetails.txt");
    fout << " Name              Hours  Regular  Overtime  Gross    Taxes    Net" << endl;  // heading for file
    fout.close();
    fout.open("checkInfo.txt");
    fout << "Net Pay    Name";   // heading for file two
    fout.close();

    for (int i = 0; i < count; i++)
    {
        employeeArray[i].printPayDetails(fout << endl);
    }

    return 0;
}

打印功能-

void Payroll::printPayDetails(ostream& out)
{
    double normPay = getNormPay();
    double overTime = getOverPay();
    double grossPay = getGrossPay();
    double taxAmount = getTaxRate();
    double netPay = computePay();
    const int SIZE = 9;
    ofstream fout;

    fout.open("payrollDetails.txt");
    out << setw(19) << left << name << fixed << setprecision(2) << right << setw(5) << hours  << setw(SIZE)  << normPay << setw(SIZE) << overTime ;
    out << setw(SIZE) << grossPay << setw(SIZE) << taxAmount <<setw(SIZE) << netPay;
    fout.close();

    fout.open("checkInfo.txt");
    out << netPay << "        " << name;
    fout.close();
}
4

1 回答 1

0

我看到的唯一问题是您没有清除流中的前导换行符:

while (fin >> payrate >> dependents)
{
    getline(fin, name);

在 while 循环中执行提取后,流中会留下一个换行符。std::getline()当它看到换行符时将停止输入,所以你必须通过调用来摆脱它ignore()

fin.ignore();
getline(fin, name);

由于ignore()返回对流的引用,您甚至可以在参数中使用它:

getline(fin.ignore(), name);

但更惯用的是使用std::ws,一个丢弃所有前导空格的操纵器:

getline(fin >> ws, name);

您还需要将它放在if语句中以检查它是否成功:

while (fin >> payrate >> dependents && getline(fin >> ws, name))
{
    // ...
于 2014-02-20T02:20:32.980 回答