在这里得到一个错误,但不确定它是什么

时间:2014-08-28 00:44:28

标签: c++ visual-c++ file-io inputstream outputstream

我的构建在这里完全成功,但没有输出到我的文本文件,我知道几天前我问了一个关于这个程序的问题,我已经改变了它。我现在做错了什么?

先谢谢你们。 我正在尝试从employeesIn.txt文件输入并创建一个由员工结构组成的employeesOut.txt文件。

这是我的文本文件。

123,John,Brown,125 Prarie Street,Staunton,IL,62088
124,Matt,Larson,126 Hudson Road,Edwardsville,IL,62025
125,Joe,Baratta,1542 Elizabeth Road,Highland,IL,62088
126,Kristin,Killebrew,123 Prewitt Drive,Alton,IL,62026
127,Tyrone,Meyer,street,999 Orchard Lane,Livingston,62088

输出应该看起来像

员工记录:123 姓名:约翰布朗 家庭住址:125 Prarie Street 斯坦顿,IL 62088

员工记录:124 名字马特拉尔森 家庭住址:....等等

这是我的代码。

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

using namespace std;

struct Person {
    string first;
    string last;
};

struct Address {
    string street;
    string city;
    string state;
    string zipcode;
};

struct Employee {
    Person name;
    Address homeAddress;
    int eid;
};

int readEmployee(istream& in, Employee eArray[]);
void displayEmployee(ostream& out,Employee eArray[], int EmployeePopulation);
const int arr=50;
Employee eArray[arr];

ifstream fin;
ofstream fout;

int main(int argc, const char * argv[])
{   
    fin.open("employeesIn.txt");

    if (!fin.is_open()) {
        cerr << "Error opening employeesIn.txt for reading." << endl;
        exit(1);
    }
    fout.open("employeesOut.txt");
    if (!fout.is_open()) {
        cerr << "Error opening employeesOut.txt for writing." << endl;
        exit(1);
    }

    int tingle = readEmployee(fin, eArray);

    fin.close();
    displayEmployee(fout, eArray, tingle);        
    fout.close();

    exit(0);
}

int readEmployee(istream& in, Employee eArray[])
{
    string eidText;
    string line;
    getline(in, line);

    int EmployeePopulation = 0;
    while (!in.eof()) {    
        getline(in, eidText, ',');
        eArray[EmployeePopulation].eid = stoi(eidText);
        getline(in, eArray[EmployeePopulation].name.first, ',');
        getline(in, eArray[EmployeePopulation].name.last, ',');
        getline(in, eArray[EmployeePopulation].homeAddress.street, ',');
        getline(in, eArray[EmployeePopulation].homeAddress.city, ',');
        getline(in, eArray[EmployeePopulation].homeAddress.state, ',');
        getline(in, eArray[EmployeePopulation].homeAddress.zipcode);
        EmployeePopulation++;        
    }
    return EmployeePopulation;    
}

void displayEmployee(ostream& out, Employee eArray[], int EmployeePopulation)
{
    for (int i = 0; i <= EmployeePopulation - 1; i++) {
        out << "Employee Record: " << eArray[i].eid
            << endl
            << "Name: " << eArray[i].name.first << " " << eArray[i].name.last
            << endl
            << "Home address: " << eArray[i].homeAddress.street
            << endl
            << eArray[i].homeAddress.city << ", " << eArray[i].homeAddress.state << " " <<  eArray[i].homeAddress.zipcode
            << endl
            << endl;
    }
}

3 个答案:

答案 0 :(得分:1)

两件事:

您应该在主页末尾使用return 0而不是exit(0)

在执行多次读取并尝试转换数据后检查eof是错误的。您需要检查读取本身是否失败。

这可以纠正eof问题。程序崩溃了,因为stoi在读取失败时抛出异常。

int readEmployee(istream& in, Employee eArray[])
{
    string eidText;
    string line;
    //This discards the first line.  Incorrect for the test data you supplied.
    getline(in, line);

    int EmployeePopulation = 0;
    //Check for errors while reading, not eof after the fact.
    //This was crashing because stoi failed when no data was
    //read due to eof being true after the loop check.
    while(  getline(in, eidText, ',') &&
            getline(in, eArray[EmployeePopulation].name.first, ',') &&
            getline(in, eArray[EmployeePopulation].name.last, ',') &&
            getline(in, eArray[EmployeePopulation].homeAddress.street, ',') &&
            getline(in, eArray[EmployeePopulation].homeAddress.city, ',') && 
            getline(in, eArray[EmployeePopulation].homeAddress.state, ',') &&
            getline(in, eArray[EmployeePopulation].homeAddress.zipcode))
    {
        eArray[EmployeePopulation].eid = stoi(eidText);
        EmployeePopulation++;
    }
    return EmployeePopulation;
}

答案 1 :(得分:1)

如果您使用vector Employee,则问题会更少 您可以通过参考函数传递它 这些功能可以使用std::vector::size()获得员工数量。 使用std::vector方法时,push_back会自动展开。

如果您为类创建了输入和输出方法,则不必违反封装:

class Person // using class to support privacy and encapsulation
{
    std::string first_name;
    std::string last_name;
  public:
    friend std::istream& operator>>(std::istream& inp, Person& p);
    friend std::ostream& operator<<(std::ostream& out, const Person& p);
};

std::istream& operator>>(std::istream& inp, Person& p)
{
  std::getline(inp, p.first_name, ',');
  std::getline(inp, p.last_name, ',');
}

std:ostream& operator<<(std::ostream& out, const Peron& p)
{
  out << "Name: ";
  out << p.first_name;
  out << " ";
  out << p.last_name;
}

class Employee
{
  Person name;
  Address addr;
  public:
    friend std::istream& operator>>(std::istream& inp, Employee& e);
};

std::istream& operator>>(std::istream& inp, Employee& e)
{
  inp >> name;
  inp >> addr;
};

缺少格式化的输入和输出留给读者练习。

答案 2 :(得分:0)

readEmployee函数中,您通过了isstream& in。我想您应该检查while (!in.eof())而不是while (!fin.eof())。 而且您的getline(fin, line);也应为getline(in, line);