Помещение значений текстового файла в связанный список

0

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
  • 0
    Вам не нужна #pragma once в файле cpp.
  • 3
    в то время как! in.eof - это плохая вещь stackoverflow.com/questions/5605125/…
Показать ещё 4 комментария
Теги:
linked-list
visual-studio-2012

1 ответ

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. Разбор существующего файла

Если мы не можем изменить формат существующего файла, нам нужно найти способ отличить разные типы записей от существующего контекста. В этом случае тот факт, что записи клиента имеет четыре поля, а записи транзакций имеют три поля или тот факт, что записи клиента содержат нечисловое второе поле, в то время как записи транзакций имеют числовые поля второго поля, могут использоваться для их различения.

Чтобы подсчитать поля, второй ответ: Разделить строку в C++? показывает простой подход.

В качестве альтернативы, изначально можно предположить, что каждая запись является записью транзакции, а затем обрабатывает ошибку, которая будет возникать, когда мы попытаемся прочитать второе поле в целое число. См. Как заблокировать недопустимый ввод в C++? для хорошего обсуждения различных способов сделать это.

Какой бы подход ни использовался, для любого практического приложения должен быть некоторый дополнительный код проверки ошибок.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню