Pregunta

Estoy haciendo un software de reserva de aerolínea y no sé mucho sobre el Visual C ++. Estoy usando el compilador simple "TCWIN45". En mi programa deseo usar el manejo de archivos y debo guardar todas las entradas en el archivo de texto. Necesito agregar la opción de búsqueda y la opción de modificación. Si el usuario elige buscar e ingresar el nombre, ¿cómo puedo acceder a un número específico de líneas? Porque mis archivos contienen el registro de múltiples pasajeros, pero quiero mostrar los datos de los únicos. Lo mismo es el caso de modificación. Quiero acceder a una ubicación o línea específica y también sobrescribirla. Por favor sugiéreme la forma más simple.

Este es mi código para guardar todo el registro en un archivo de texto:

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------------------------------";
¿Fue útil?

Solución

Ali, esto se puede hacer en un archivo plano si realmente desea no usar una base de datos. El truco es: 1.) Tener todos los registros del mismo tamaño o 2.) Tener un "encabezado de registro" que proporcione información "suficiente" para poder unircho el registro del disco duro. Si almacena diferentes tipos de registros, la información "suficiente" podría ser el tamaño del registro o un tipo de registro para fines RTTI. Me parece útil almacenar también una ID para cada registro para poder almacenar una tabla de índice para compensaciones de registros.

Si sus registros tienen tamaños variables, las funciones de serialización de su registro deben poder manejar esto. De hecho, es trivial hacer esto.

La tabla de índice es una tabla de compensaciones de archivos.

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;

Entonces, para encontrar la posición del registro, encuentre el desplazamiento en el archivo, que es índices [Record_id]. Agregar un registro es como agregar un nodo a una lista vinculada, pero los nodos están en el archivo. Eliminar registros es un poco complicado. Debe usar "Lazy Elelel" para eliminar los registros y luego se reutilizan estos registros eliminados. Incluso puede escribir una función de contracción que eliminará todos los registros eliminados del archivo para liberar el espacio no utilizado.

Las limitaciones de esta técnica es que solo puede buscar por ID de registro. Si tiene otra información, deberá generar estructuras de datos adicionales para respaldar esto.

Tengo un código disponible que hace esto en C si desea un ejemplo de trabajo. Sin embargo, hacer esto desde cero es factible pero no vale la pena el esfuerzo. Simplemente use una base de datos como SQLite o MySQL, ¡ahorrará tiempo!

Código de ejemplo

Otros consejos

Desde sus comentarios hasta otras respuestas, no parece que la mejor manera de hacerlo es almacenar los datos en un archivo de texto. Probablemente quieras un Reservation clase que contiene toda la información para la reserva. Luego, use algún tipo de colección para almacenar todas las reservas. Escribir en un archivo de texto solo agrega una gran cantidad de dificultad innecesaria.

Algo como esto:

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

Sería aún mejor si hiciera clases separadas para cada uno de los miembros de la clase (como un Day clase A FlightType clase, etc.).

Luego usarías algún tipo de Map para acceder a una reserva particular y cambiar a sus miembros.

Probablemente querrás definir un reservation clase que representa una sola reserva y un data clase, que contiene todos sus datos, como un vector de reservations. La clase de datos querrá tener una función miembro que tome un std::ostream por referencia, y guarda las reservas a un archivo de texto (más fácil es una variable por línea). También querrá una función miembro que tome un std::istream por referencia y lee en los datos del archivo de texto.

La parte principal de su programa (estoy haciendo toneladas de suposiciones aquí) cargaría el archivo en el data clase con el std::istream Función miembro y le pide al usuario algún tipo de identificación. Luego llamas a una función de miembro de data que verifica todos los elementos en dataS vector hasta que encuentre la identificación coincidente (por referencia) y le permite al usuario cambiar a algunos miembros. Entonces llama al std::ostream Función del miembro nuevamente para guardar los cambios.

Las corrientes se manejan así. En esta muestra, no uso el data clase o un vector, ya que esta pregunta se parece sospechosamente a la tarea, pero esto muestra las partes difíciles del manejo de archivos.

#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;       
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top