2015-01-08 2 views
0

im чтение ряда записей в связанном списке, и я хочу остановиться в определенный момент, список файлов содержит следующие данные: имя и фамилия имени и город после их завершения тогда accoutn числа: баланс номера, это список банковских счетов, heres мой код. Я хочу, чтобы он остановился, когда начинаются номера банковских счетов, поскольку я планирую разместить их в другом связанном списке.Размещение значений текстового файла в связанном списке

#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 Информация:

90009074 80007964  11640 
90000034 80007964  -6458 
+0

Вам не нужно '#pragma once' в cpp-файле. – Borgleader

+3

while! In.eof - это плохая вещь http://stackoverflow.com/questions/5605125/why-is-iostreameof-inside-a-loop-condition-considered-wrong – pm100

+0

, пожалуйста, отправьте пример ввода данных – pm100

ответ

0

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

«Как моя программа d тушить между строками во входном файле, который предоставляет данные и строки клиентов, которые предоставляют данные транзакций? "

Учитывая этот вопрос, есть два общих подхода к проблеме:

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. Parse существующий файл

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

Чтобы подсчитать поля, второй ответ Split a string in C++? показывает простой подход.

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

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

Смежные вопросы