从输入文件写入输出文件

Writing from an input file to an output file

提问人:MatthewTingle 提问时间:8/25/2014 最后编辑:MatthewTingle 更新时间:8/25/2014 访问量:830

问:

我在这段代码中打开我的文本文件时遇到问题。我的做法正确吗?本周刚开始C++。

我现在在写入输出文件时遇到麻烦。我得到的唯一输出就是这个。libc++abi.dylib:终止,并出现类型为 std::invalid_argument 的未捕获异常:stoi:无转换 (LLDB的)

提前感谢伙计们。

这是我的员工在.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>

这是我的代码

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

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;
};

void readEmployee(istream& in, Employee& e);
void displayEmployee(ostream& out, const Employee& e);

int main(int argc, const char * argv[])
{
Employee e[50];

ifstream fin;
ofstream fout;

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 EmployeePopulation = 0;
readEmployee(fin, e[EmployeePopulation]);
while (!fin.eof()) {
    EmployeePopulation++;
    readEmployee(fin, e[EmployeePopulation]);
}
fin.close();
for (int i = 0; i <= EmployeePopulation - 1; i++) {
    displayEmployee(fout, e[i]);
}

fout.close();

cout << endl;

return 0;
}

void readEmployee(istream& in, Employee& e)
{
string eidText;
if ( getline(in, eidText, ',') ) {
    e.eid = stoi(eidText);

    getline(in, e.name.first, ',');
    getline(in, e.name.last, ',');

    getline(in, e.homeAddress.street, ',');
    getline(in, e.homeAddress.city, ',');
    getline(in, e.homeAddress.state, ',');

    string zipcodeText;
    getline(in, zipcodeText, ',');
    e.homeAddress.zipcode = stoi(zipcodeText);
}


}
void displayEmployee(ostream& out, const Employee& e)
{
out << "Customer Record: " << e.eid
<< endl
<< "Name: " << e.name.first << " " << e.name.last
<< endl
<< "Home address: " << e.homeAddress.street
<< endl
<< e.homeAddress.city << ", " << e.homeAddress.state << " " << e.homeAddress.zipcode
<< endl
<< endl
<< endl;
}
C 视觉对象-C++ 文件- IOstream

评论

0赞 Dakorn 8/25/2014
您的错误消息说明了问题所在。您的程序无法打开给定的文件。检查文件“employeesIn.txt”和二进制文件是否在同一目录中。
0赞 MatthewTingle 8/25/2014
我在两个文件夹中都有它,所以我不确定出了什么问题。
1赞 MatthewTingle 8/25/2014
好吧,我想通了,现在的问题是为什么它不把它写到我的员工Out.txt文件中?我没有收到任何错误。除此之外,在我的输出框中。libc++abi.dylib:终止,出现类型为 std::invalid_argument 的未捕获异常:stoi:无转换 (lldb)
0赞 Martin James 8/26/2014
使用中间临时变量,关闭所有优化,执行调试构建,使用调试器断点/步骤/检查内容。修复发现的问题。

答:

3赞 Lightness Races in Orbit 8/25/2014 #1

这正是它所说的:失败。stoi

你只有两次,所以很明显,要么你的不是数字,要么是你的邮政编码不是数字。eidText

我们不知道这是由于输入文件的问题还是解析问题,因此请先输出并转到控制台,以便您可以查看它们的值,然后相应地继续诊断。eidTextzipcodeTextstoi

评论

0赞 MatthewTingle 8/25/2014
我更改了我的原始帖子,以包括我的员工在 .txt 文件中的样子。我需要将我的邮政编码声明从字符串邮政编码更改为字符串邮政编码吗?到 int 邮政编码; ?
0赞 MatthewTingle 8/25/2014
因此,只需将其显示 fout 的任何地方更改为 cout,以便我可以在控制台中看到值?
0赞 Lightness Races in Orbit 8/25/2014
@MatthewTingle 不......你用的是哪本书?现在您已经添加了输入,很清楚发生了什么。将文本读入,然后用于将其转换为整数。但不是整数。你需要以某种方式处理这些。简单地使用一行临时代码写入控制台就会向你揭示这一点,这是微不足道的!"<62025>"zipcodeTextstd::stoi<62025><>zipcodeText
0赞 MatthewTingle 8/26/2014
因此,将zipcodeText输出到控制台,以便我可以看到它。我只是写<< cout zipcodeText;在我的主要正确之前?
0赞 MatthewTingle 8/26/2014
C++ 编程,程序设计,包括数据结构,D.S. Malik 第六版