向量函数程序问题

时间:2017-11-09 01:24:45

标签: c++

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


using namespace std;
void check(ifstream &iFile)
{
    if (!iFile.is_open())
    {
        cout << "Data file not found!" << endl;
        system("pause");
        exit(1); // exit the program if the file is not found.
    }
}

void readIn(ifstream &iFile, vector<string> &fName, vector<string> &lName, vector<string> &jTitle, vector<string> &eID, vector<double> &hoursWorked, vector<double> &wage, vector<int> &deductions, vector<double> &sPay, string sTemp, double dTemp, int iTemp)
{
    while (!iFile.eof())
    {
        iFile >> sTemp;
        fName.push_back(sTemp);

        iFile >> sTemp;
        lName.push_back(sTemp);

        iFile.ignore();
        getline(iFile, sTemp);
        jTitle.push_back(sTemp);

        iFile >> sTemp;
        eID.push_back(sTemp);

        iFile >> dTemp;
        hoursWorked.push_back(dTemp);

        iFile >> dTemp;
        wage.push_back(dTemp);

        iFile >> iTemp;
        deductions.push_back(iTemp);

        iFile >> dTemp;
        sPay.push_back(dTemp);

    }
    cout << "completed" << endl;

}

int main()
{
    ifstream iFile;
    iFile.open("data.txt");
    check(iFile);

    vector<string> fName, lName, eID, eStatus, jTitle;
    vector<double> nPay, gPay, oPay, oHours;
    vector<double> hoursWorked, wage, sPay;
    vector<int> deductions;

    // temporary names to pass to the vector
    string sTemp; // string temp
    double dTemp=0; // double temp
    int iTemp=0; // integar temp
    readIn(iFile, fName, lName, jTitle, eID, hoursWorked, wage, deductions, sPay, sTemp, dTemp, iTemp);
/*  while (!iFile.eof())
    {
        iFile >> sTemp;
        fName.push_back(sTemp);

        iFile >> sTemp;
        lName.push_back(sTemp);

        iFile.ignore();
        getline(iFile, sTemp);
        jTitle.push_back(sTemp);

        iFile >> sTemp;
        eID.push_back(sTemp);

        iFile >> dTemp;
        hoursWorked.push_back(dTemp);

        iFile >> dTemp;
        wage.push_back(dTemp);

        iFile >> iTemp;
        deductions.push_back(iTemp);

        iFile >> dTemp;
        sPay.push_back(dTemp); 
    }*/

    int sizeOf = fName.size();
    for (int a = 0; a < sizeOf; a++)
    {
        cout << fName.size() << " FName " << fName[a] << " LName " << lName[a] << " JobTitle " << jTitle[a] << endl;
        cout << "EmployeeID " << eID[a] << " Hours Worked " << hoursWorked[a] << " Hourly Wage " << wage[a] << endl;
        cout << "Deductions " << deductions[a] << " Salary Pay " << sPay[a] << endl;
    }

    system("pause");
    return 0;
}

我遇到了一个我的功能无法做任何事情的问题。它会编译,但没有输出。事情就是当我从所有部件中取出矢量sPay时,它完美地工作。有关为什么这一部分不起作用的任何建议?从我有限的知识来看,它应该可以很好地工作,但是我无法弄清楚是什么原因造成的。

我的示例文本文件是

Alan
WakeField
IT GUY
T2034
40
15
1
Hourly
0.00

2 个答案:

答案 0 :(得分:1)

您的输入文件与您的阅读代码不符。您显示的文件中有9个值,但您的代码只尝试读取8个值。

<?php // Proper way $jsonA = json_encode(new stdClass); // This works but more complex $jsonB = json_encode((object)array()); echo $jsonA; echo PHP_EOL; echo $jsonB; 获得此代码时:

readIn()

它尝试读取iFile >> dTemp; sPay.push_back(dTemp); ,但文件却有double,因此读取失败。

因此,要么从文件中删除Hourly行,要么添加对Hourly的调用以读取该行。

此外,参数iFile >> sTempstring sTempdouble dTemp应声明为局部变量,而不是输入参数。

此外,int iTemp没有进行任何错误处理。您的readIn()代码无效假设名字向量与其他向量的大小完全匹配,但main()并不能保证这一点。

最后,在您阅读任何内容之前检查readIn()是错误的。在读取操作尝试读取过去的EOF之前,不会更新流的eof()标志。

您应该考虑重写此代码。例如,尝试更像这样的东西:

eofbit

或者,由于您的数据是基于行的,因此您应使用#include <iostream> #include <string> #include <fstream> #include <vector> struct Employee { std::string fName; std::string lName; std::string title; std::string eID; double hoursWorked; double wage; int deductions; std::string wageType; double sPay; Employee() : hoursWorked(0), wage(0), deductions(0), sPay(0) { } }; void check(std::ifstream &iFile) { if (!iFile.is_open()) { std::cout << "Data file not found or unable to open!" << std::endl; std::system("pause"); exit(1); // exit the program. } } void readIn(std::ifstream &iFile, std::vector<Employee> &employees) { std::ios_base::iostate oldstate = iFile.exceptions(); iFile.exceptions(std::ifstream::badbit | std::ifstream::failbit); try { do { Employee emp; iFile >> emp.fName; iFile >> emp.lName; std::getline(iFile, emp.title); iFile >> emp.eID; iFile >> emp.hoursWorked; iFile >> emp.wage; iFile >> emp.deductions; iFile >> emp.wageType; iFile >> emp.sPay; employees.push_back(emp); } while (!iFile.eof()); } catch (const std::ios_base::failure &) { std::cout << "Data file corrupted!" << std::endl; std::system("pause"); exit(1); // exit the program. } iFile.exceptions(oldstate); std::cout << "completed" << std::endl; } int main() { std::ifstream iFile("data.txt"); check(iFile); std::vector<Employee> employees; readIn(iFile, employees); int sizeOf = employees.size(); for (int a = 0; a < sizeOf; a++) { std::cout << "FName " << employees[a].fName << " LName " << employees[a].lName << " JobTitle " << employees[a].title << std::endl; std::cout << "EmployeeID " << employees[a].eID << " Hours Worked " << employees[a].hoursWorked << " << employees[a].wageType << " Wage " << employees[a].wage << std::endl; std::cout << "Deductions " << employees[a].deductions << " Salary Pay " << employees[a].sPay << std::endl; std::cout << std::endl; } std::system("pause"); return 0; } 读取每一行,然后使用std::getline()来解析值:

std::istringstream

答案 1 :(得分:0)

我去了derp一会儿。我忘记了每小时读书或领薪前的薪水。