1

我正在制作一个航空公司预订软件,但我对 Visual C++ 了解不多。我正在使用简单的编译器“TCWIN45”。在我的程序中,我希望使用文件处理,并且我成功地将所有输入保存在文本文件中。我需要添加搜索选项和修改选项。如果用户选择搜索并输入名称,那么我如何访问特定数量的行。因为我的文件包含多个乘客的记录,但我想显示唯一的数据。修改也是如此。我想访问特定的位置或线路并覆盖它。请建议我最简单的方法。

这是我将所有记录保存在一个文本文件中的代码:

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------------------------------";
4

3 回答 3

0

您可能希望定义一个reservation表示单个预订的类和一个data保存所有数据的类,作为vectors的 a reservation。数据类将希望有一个成员函数,该函数接受std::ostream引用,并将保留保存到文本文件中(最简单的是每行一个变量)。它还需要一个成员函数,该函数std::istream通过引用并从文本文件中读取数据。

您的程序的主要部分将(我在这里做出大量假设)将文件加载到data具有std::istream成员函数的类中,并要求用户提供某种 ID。然后调用一个成员函数data来检查datas 向量中的所有元素,直到找到匹配的 ID(通过引用),并让用户更改一些成员。然后它std::ostream再次调用成员函数来保存更改。

流是这样处理的。在这个示例中,我没有使用data类或向量,因为这个问题看起来很像家庭作业,但这显示了文件处理的棘手部分。

#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;       
}
于 2011-09-06T19:36:24.217 回答
0

从您的评论到其他答案,您执行此操作的最佳方法似乎根本不是将数据存储在文本文件中。您可能需要一个Reservation包含所有预订信息的类。然后,使用某种 Collection 来存储所有预订。写入文本文件只会增加大量不必要的困难。

像这样的东西:

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

如果您为每个班级成员(如Day班级、FlightType班级等)创建单独的班级,那就更好了。

然后,您将使用某种方式Map访问​​特定预订并更改其成员。

于 2011-09-06T20:24:53.027 回答
0

阿里,如果你真的不想使用数据库,这可以在平面文件中完成。诀窍是:1.)所有记录的大小相同或 2.)有一个“记录头”,它提供“足够”的信息,以便能够从硬盘中反序列化记录。如果您存储不同类型的记录,“足够”的信息可能是记录的大小或用于 RTTI 目的的记录类型。我发现为每条记录存储一个 ID 也很有用,这样我就可以为记录偏移量存储一个索引表。

如果您的记录有不同的大小,那么您的记录的序列化函数必须能够处理这个问题。事实上,这样做是微不足道的。

索引表是文件偏移量表。

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;

因此,要找到记录的位置,您需要找到文件的偏移量,即 indices[record_id]。添加记录就像将节点添加到链表中,但节点在文件中。删除记录有点棘手。您必须使用“延迟删除”来删除记录,然后这些删除的记录会被重用。您甚至可以编写一个收缩函数,从文件中删除所有已删除的记录以释放未使用的空间。

这种技术的局限性在于您只能通过记录 id 进行搜索。如果您有其他信息,则需要生成其他数据结构来支持这一点。

如果您想要一个工作示例,我有可用的代码在 C 中执行此操作。但是,从头开始这样做是可行的,但不值得努力。只需使用 Sqlite 或 MySQL 之类的数据库——它会节省时间!

示例代码

于 2011-09-06T21:03:49.057 回答