Domanda

Sto facendo un software di prenotazione aerea e io non ne so molto di Visual C ++. Sto usando il semplice compilatore "TCWIN45". Nel mio programma ho desidero utilizzare la gestione dei file e sto riesco a salvare tutti gli ingressi in file di testo. Ho bisogno di aggiungere un'opzione di ricerca e l'opzione di modifica. Se l'utente sceglie di ricerca e inserire il nome allora come posso accedere numero specifico di linee. perché i miei file contiene il record di più passeggeri ma voglio mostrare i dati l'unico è. stesso vale per la modifica. Voglio specifica posizione di accesso o di linea e anche sovrascrivere. per favore mi suggeriscono il modo più semplice.

Questo è il mio codice per salvare tutti il ??record in un file di testo:

ofstream thefile("ID.txt" , ios::app);
thefile<<"\n\nDay : "<<p1[i].day<<"\nFlight Date : "<<p1[i].date<<"\nFlight Type : "<<p1[i].type<<"\nReturn Date : "<<p1[i].rdate<<"\nDeparture Place : "<<p1[i].from<<"\nDestination : "<<p1[i].to<<"\nClass Type : "<<p1[i].clas<<"\nTime of Flight : "<<p1[i].time<<"\nTitle : "<<p1[i].prefix<<"\nFirst Name : "<<p1[i].fname<<"\nLast Name : "<<p1[i].lname<<"\nDate of Birth : "<<p1[i].dob<<"\nPassport Number : "<<p1[i].ppt_no<<"\nExpiry Date : "<<p1[i].edate<<"\n Contact Number : "<<p1[i].cont<<"\nMeal Type : "<<p1[i].meal<<"\n\n------------------------------";
È stato utile?

Soluzione

Ali, questo può essere fatto in un file flat se si vuole veramente di non utilizzare un database. Il trucco, è quello di uno: 1.) hanno tutti i record della stessa dimensione o 2.) hanno una "intestazione record" che fornisce informazioni "abbastanza" per essere in grado di deserializzare il record dal disco rigido. Se si memorizzano diversi tipi di record, le informazioni "abbastanza" potrebbe essere dimensione del record o un tipo di record per scopi RTTI. Trovo utile per memorizzare anche un ID per ogni record in modo da poter memorizzare una tabella di indice per gli offset dei record.

Se i record hanno varie dimensioni, quindi le funzioni di serializzazione del vostro record devono essere in grado di gestire questa situazione. In realtà, è banale per fare questo.

La tabella indice è una tabella di offset di file.

typedef uint16_t record_id;
typedef long offset_t;

offset_t  indices[ MAX_RECORDS ];


typedef struct _record {
     uint16_t type;
     uint16_t id;
     offset_t next;
     offset_t prev;
} record;

typedef struct _header {
   uint32_t count;
   offset_t first_record;
   offset_t deleted_record;
} header;

Quindi, per trovare la posizione del record, si trova l'offset nel file, che è gli indici [record_id]. L'aggiunta di un record è come l'aggiunta di un nodo a una lista concatenata, ma i nodi sono nel file. Eliminazione di record è un po 'difficile. Devi usare "pigro Elimina" per record cancellare e poi questi record eliminati ottenere riutilizzati. Si può anche scrivere una funzione di retrazione che rimuoverà tutti i record eliminati dal file per liberare spazio inutilizzato.

I limiti di questa tecnica è che si può solo cercare attraverso il record di id. Se si dispone di altre informazioni, è necessario generare strutture di dati aggiuntivi a sostegno di questa.

Ho codice disponibile che fa questo in C se si desidera un esempio di lavoro. Tuttavia, facendo questo da zero è fattibile, ma non vale la pena. Basta usare un database come MySQL o SQLite - che farà risparmiare tempo

Esempio di codice

Altri suggerimenti

Da vostri commenti a altre risposte, non sembra come il modo migliore per voi per fare questo è quello di memorizzare i dati in un file di testo a tutti. Probabilmente si vorrà una classe Reservation che contiene tutte le informazioni per la prenotazione. Quindi, utilizzare un qualche tipo di raccolta per memorizzare tutte le prenotazioni. Scrivendo a un file di testo aggiunge solo una quantità enorme di inutili difficoltà.

Qualcosa di simile a questo:

class Reservation
{
    std::string day;
    std::string date;
    std::string flightType;
    std::string meal;
    /* ... */
};

Sarebbe ancora meglio se hai fatto classi separate per ciascuno dei membri della classe (come una classe Day, una classe FlightType, ecc.).

Si potrebbe quindi utilizzare un qualche tipo di Map per accedere a un particolare prenotazione e cambiare i suoi membri.

probabilmente si vorrà definire una classe reservation che rappresenta una singola prenotazione, e una classe data, che contiene tutti i dati, come vector di reservations. La classe di dati vorrà avere una funzione di membro che prende un std::ostream per riferimento, e salva le riserve per un file di testo, (più facile è una variabile per riga). Sarà inoltre una funzione di membro che prende un std::istream per riferimento e legge nei dati dal file di testo.

La parte principale del programma sarebbe (sto facendo tonnellate di ipotesi qui) caricare il file nella classe data con la funzione di membro std::istream, e chiede l'utente per una sorta di ID. È quindi chiamare una funzione di membro di data che controlla tutti gli elementi in datas vettore finché non trova l'ID corrispondente (per riferimento), e permette il cambio utente alcuni membri. Poi si chiama di nuovo la funzione membro std::ostream per salvare le modifiche.

Streams sono gestiti in questo modo. In questo esempio, io non uso la classe data o di un vettore, dal momento che questa domanda assomiglia in modo sospetto compiti a casa, ma questo mostra le parti più difficili di gestione dei file.

#include <string>
#include <iostream>
#include <fstream>

class Reservation {
    std::string ID;
    std::string date;
public:
    //default constructor
    Reservation()
    {}
    //helpful constructor
    Reservation(std::string _id, std::string _date)
    :ID(_id), date(_date)
    {}
    //copy constructor
    Reservation(const Reservation& b)
    :ID(b.ID), date(b.date)
    {}
    //move constructor
    Reservation(Reservation&& b)
    :ID(std::move(b.ID)), date(std::move(b.date))
    {}
    //destructor
    ~Reservation() 
    {}
    //assignment operator
    Reservation& operator=(const Reservation& b)
    {
        ID = b.ID;
        date = b.date;
        return *this;
    }
    //move operator
    Reservation& operator=(Reservation&& b)
    {
        ID = std::move(b.ID);
        date = std::move(b.date);
        return *this;
    }
    //save
    std::ostream& save(std::ostream& file) {
        file << ID << '\n';
        file << date << '\n';
        return file; //be in the habit of returning file by reference
    }
    //load
    std::istream& load(std::istream& file) {
        std::getline(file, ID);
        std::getline(file, date);
        return file; //be in the habit of returning file by reference
    }
};

int main() {
    Reservation reserve; //create a Reservation to play with

    {  //load the reservation from loadfile
        std::ifstream loadfile("myfile.txt");
        reserve.load(loadfile);
    }

    //display the reservation
    reserve.save(cout);

    { //save the reservation to a different file
        std::ofstream savefile("myfile2.txt");
        reserve.save(savefile);
    }
    return 0;       
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top