im 将许多 detals 读入链表中,我想在某个点停止,文件列表包含以下详细信息: ID 名称姓氏和城镇,在这些都通过之后,然后是帐户数字:数字余额,这是一个银行账户列表,这是我的代码。我希望它在银行帐户编号开始时停止,因为我计划将它们放入不同的链表中。
#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
帐户信息:
90009074 80007964 11640
90000034 80007964 -6458
如果我正确理解客户列表和帐户之间的交易列表都在文件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.解析现有文件
如果我们不能更改现有文件的格式,我们需要找到一种方法来区分不同类型的记录和现有上下文。在这种情况下,客户记录有四个字段,交易记录有三个字段,或者客户记录有一个非数字的第二个字段,而交易记录有一个数字第二个字段的事实,可以用来区分它们。
要计算字段,第二个答案 拆分字符串 在C++?中显示了一个简单的方法。
或者,我们可以最初假设每条记录都是交易记录,然后处理当我们尝试将第二个字段读取为整数时将发生的错误。请参阅如何在C++中捕获无效输入?以很好地讨论执行此操作的不同方法。
无论使用哪种方法,对于任何实际应用,都需要一些额外的错误检查代码。