#include "list.h"
#include "customer.h"
#include <iostream> // cout
#include <fstream>
#define FN "file.txt" // hardwired file name
#pragma once
using namespace std;
customerlist customerlist;
int main () {
int data ;
ifstream in;
in.open(FN);
if (in.fail()) {
cout << "unable to open " << FN << endl;
getchar(); // type key to dismiss window
return 0;
}
while (!in.eof()) {
customer *ustomer = new customer();
in >> ustomer->ID >> ustomer->name >> ustomer->lastname >> ustomer->town;
cout << ustomer->ID<< " " << ustomer->name << " " << ustomer->lastname<< " " << ustomer->town << endl ;
customerlist.add(ustomer);
}
in.close();
return 0;
}
输入数据样本:
80013484 ADAMS Aiden Clonakilty
80034596 ADAMS Anna-Marie Athlone
accoutn info:
90009074 80007964 11640
90000034 80007964 -6458
答案 0 :(得分:0)
如果我理解正确的客户列表和帐户之间的交易列表都在文件file.txt
中,那么您的问题似乎是:
“我的程序如何区分提供客户数据的输入文件中的行和提供交易数据的行?”
鉴于这个问题,这个问题有两种通用方法:
<强> 1。使输入文件易于解析
如果允许修改输入文件,最简单的方法是确保输入文件具有易于解析的格式。例如,我们可以更改输入文件,使其读取如下内容:
C 80013484 ADAMS Aiden Clonakilty
C 80034596 ADAMS Anna-Marie Athlone
T 90009074 80007964 11640
T 90000034 80007964 -6458
给定此输入文件,输入代码可以写为:
char flag;
in >> flag;
switch (flag)
{
case 'C': customer *ustomer = new customer();
in >> ustomer->ID >> ustomer->name >>
ustomer->lastname >> ustomer->town;
customerlist.add(ustomer);
break;
case 'T': transaction *ransaction = new transaction();
// etc.
break;
}
或者,2。解析现有文件
如果我们无法更改现有文件的格式,我们需要找到一种方法来区分不同类型的记录与现有的上下文。在这种情况下,客户记录具有四个字段并且事务记录具有三个字段,或者客户记录具有非数字第二字段而事务记录具有数字第二字段的事实可以用于区分它们。
要计算字段,Split a string in C++?的第二个答案显示了一种简单的方法。
或者,我们最初可以假设每条记录都是一个事务记录,然后处理当我们尝试将第二个字段读入整数时将发生的错误。有关不同方法的详细讨论,请参阅How to catch invalid input in C++?。
无论使用哪种方法,都需要为任何实际应用提供一些额外的错误检查代码。