im, читающий ряд записей в связанном списке, и я хочу остановиться в определенный момент, список файлов содержит следующие данные: фамилия и имя фамилии ID, после того, как все это происходит, тогда номера accoutn: баланс номера, это список банковских счетов, мой код. Я хочу, чтобы он остановился, когда начинаются номера банковских счетов, поскольку я планирую разместить их в другом связанном списке.
#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++? для хорошего обсуждения различных способов сделать это.
Какой бы подход ни использовался, для любого практического приложения должен быть некоторый дополнительный код проверки ошибок.
#pragma once
в файле cpp.