Question

Je fais un logiciel de réservation des compagnies aériennes et je ne sais pas beaucoup sur le Visual C ++. J'utilise le compilateur simple, « TCWIN45 ». Je souhaite à mon programme à utiliser la gestion des fichiers et je parviens à toutes les entrées dans le fichier texte. i besoin d'ajouter l'option de recherche et de l'option de modification. si l'utilisateur recherche et choisir Entrez le nom alors comment puis-je accéder à nombre précis de lignes. parce que mes fichiers contient l'enregistrement des passagers multiples, mais je veux montrer les données de la seule. même est le cas pour la modification. Je veux accéder à l'emplacement spécifique ou d'une ligne et aussi pour le remplacer. s'il vous plaît me suggérer la manière la plus simple.

Ceci est mon code pour sauver tout l'enregistrement dans un fichier texte:

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------------------------------";
Était-ce utile?

La solution

Ali, cela peut être fait dans un fichier plat si vous voulez vraiment de ne pas utiliser une base de données. L'astuce, est soit: 1.) ont tous les enregistrements de la même taille ou 2.) ont une « tête record » qui fournit des informations « assez » pour pouvoir désérialiser l'enregistrement du disque dur. Si vous stockez différents types de documents, des informations « assez » pourrait être la taille de l'enregistrement ou d'un type d'enregistrement à des fins RTTI. Je trouve utile de stocker également une carte d'identité pour chaque enregistrement afin que je puisse stocker une table d'index pour les décalages d'enregistrement.

Si vous avez des enregistrements tailles différentes, alors les fonctions de sérialisation de votre dossier doivent être en mesure de gérer cela. En fait, il est trivial de le faire.

La table d'index est une table de décalages de fichiers.

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;

Donc, pour trouver la position de l'enregistrement, vous trouverez le décalage dans le fichier, ce qui est des indices [record_id]. Ajout d'un enregistrement est comme l'ajout d'un nœud à une liste chaînée, mais les noeuds sont dans le fichier. Suppression d'enregistrements est un peu délicat. Vous devez utiliser « paresseux Supprimer » pour les enregistrements de suppression et plus tard ces enregistrements supprimés obtenir réutilisé. Vous pouvez même écrire une fonction de psy qui supprimera tous les enregistrements supprimés du fichier afin de libérer l'espace inutilisé.

Les limites de cette technique est que vous ne pouvez effectuer une recherche par ID d'enregistrement. Si vous avez d'autres informations, vous aurez besoin pour générer des structures de données supplémentaires à l'appui.

J'ai le code disponible qui fait cela dans C si vous voulez un exemple de travail. Cependant, cela à partir de zéro est possible, mais il ne vaut pas la peine. Il suffit d'utiliser une base de données comme MySQL ou SQLite - il gagner du temps

Exemple de code

Autres conseils

De vos commentaires à d'autres réponses, il ne semble pas être la meilleure façon pour vous de le faire est de stocker les données dans un fichier texte du tout. Vous voudrez probablement une classe Reservation qui contient toutes les informations pour la réservation. Ensuite, utilisez une sorte de collection pour stocker toutes les réservations. L'écriture dans un fichier texte ajoute juste une énorme quantité de difficulté inutile.

Quelque chose comme ceci:

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

Il serait encore mieux si vous avez fait des classes séparées pour chacun des membres de la classe (comme une classe Day, une classe FlightType, etc.).

Vous pouvez ensuite utiliser une sorte de Map d'accéder à une réserve particulière et changer ses membres.

Vous aurez probablement envie de définir une classe reservation qui représente une seule réservation, et une classe de data, qui contient toutes vos données, comme vector de reservations. La classe de données voudra avoir une fonction membre qui prend std::ostream par référence, et enregistre les réserves à un fichier texte, (plus simple est une variable par ligne). Il voudra aussi une fonction membre qui prend std::istream par référence et lit dans les données du fichier texte.

La partie principale de votre programme serait (je fais TONNES d'hypothèses ici) charger le fichier dans la classe data avec la fonction membre de std::istream, et demande à l'utilisateur une sorte d'identité. Ensuite, vous appelez une fonction membre de data qui vérifie tous les éléments dans le vecteur de datas jusqu'à ce qu'il trouve l'ID correspondant (par référence), et permet à l'utilisateur de modifier certains membres. Ensuite, il appelle à nouveau la fonction de membre de std::ostream pour enregistrer les modifications.

cours d'eau sont traités comme ça. Dans cet exemple, je ne pas utiliser la classe data ou un vecteur, étant donné que cette question ressemble étrangement à des devoirs, mais cela montre les pièces délicates de la gestion des fichiers.

#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;       
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top