Запись/считывание структуры в текстовый файл

Azazel-San

Здравствуйте! Нужна помощь, я создаю структуру, заполняю её и вывожу на экран в форме таблицы, с этим все окей, но я хочу сделать так: к примеру при запуске программы мне дается выбор: нажать 1 (для заполнения структуры) или 2 (для вывода и просмотра таблицы с уже заполнеными ранее данными). Так вот нужна помощь именно со "2", никак не могу понять как можно записать все в файл, а потом эти все данные считать и манипулировать ними. Если для записи ещё понятно как можно сделать, используя обычную ф-ю типа:
ofstream fout (); fout << "Данные";
то со считывание совсем не ясно.. Вот мой код:
Кликните здесь для просмотра всего текста
#include <iostream>
#include <string>
#include <iomanip>
#include <windows.h>
#include <fstream>
 
using namespace std;
 
struct Airplane
{
    string destination;
    string departure; 
    string name; 
    int number; 
    string time; 
 
    void init();
    void show() const;
};
 
void Airplane::init()
{
 
}
 
void Airplane::show() const
{
    cout << "____________________________________________________________________________" << endl;
    cout << "Flight number    Name of Plane    Departure    Destination    Departure time" << endl;
    cout << "----------------------------------------------------------------------------" << endl;
}
 
int main()
{
    int n = 2, k, i, size;
    string dep;
    cout << "Enter 1 for write OR 2 for read: ";
    cin >> k;
    Airplane *a = new Airplane[n];
    if (k == 1)
    {
        //cout << "Enter the number of flights: ";
        //cin >> n;
        //Airplane *a = new Airplane[n];
        cout << "Flight number/Name of Plane/Departure/Destination/Departure time" << endl;
        for (i = 0; i < n; ++i)
        {
            cout << "Flight " << i + 1 << ":" << endl;
            a[i].number = i;
            cout << "----------------" << endl;
            cout << "Enter name of plane: "; cin >> a[i].name;
            cout << "Departure in: ";        cin >> a[i].departure;
            cout << "Destination in: ";      cin >> a[i].destination;
            cout << "Time: ";                cin >> a[i].time;
            cout << "----------------" << endl;
        }
 
        ofstream fout ("Airport.TXT", ios::app);
 
        cout << "____________________________________________________________________________" << endl;
        cout << "Flight number    Name of Plane    Departure    Destination    Departure time" << endl;
        cout << "----------------------------------------------------------------------------" << endl;
        for (i = 0; i < n; ++i)
        {
            cout << setw(12) << a[i].number + 1 << setw(15)
                 << a[i].name << setw(15) << a[i].departure
                 << setw(15) << a[i].destination << setw(18)
                 << a[i].time << endl;
            cout << "----------------------------------------------------------------------------" << endl;
        }
    cout << "Enter departure: ";
    cin >> dep;
    for (i = 0; i < 1; ++i) a[i].show();
    for (i = 0; i < n; ++i)
    {
        if (a[i].departure == dep)
        {
            cout << setw(12) << a[i].number + 1 << setw(15)
                 << a[i].name << setw(15) << a[i].departure
                 << setw(15) << a[i].destination << setw(18)
                 << a[i].time << endl;
            cout << "----------------------------------------------------------------------------" << endl;
        }
        else
        {
            cout << "Oops! There is no flight!" << endl;
        }
    }
        fout.close();
        delete[] a;
    }
    if (k == 2)
    {
        ifstream fin("Airport.TXT");
        fin.close();
    }
    system("pause");
    return 0;
}
Можете помочь с записью и считкой файла именно под мою структуру?upd.
7 ответов

Azazel-San

Записывай каждое поле в отдельную строку (с endl). Считывать будешь в той же последовательности с помощью >> для чисел и getline() для string.


Azazel-San

nmcf, а после того как считал как это вивести на экран в консоле? И как потом считанные данные к примеру в таблицу засунуть?


Azazel-San

Ну так ты считывай сразу в свой массив структур. С ним же программа уже умеет работать.


Azazel-San

nmcf, а как с getline() выводить?
getline(fin,a[i].name);
так, не работает


Azazel-San

Всю программу покажи.


Azazel-San

nmcf, Вот сделал, так вроде все работает:
#include <iostream>
#include <string>
#include <iomanip>
#include <windows.h>
#include <fstream>
 
using namespace std;
 
struct Airplane
{
    string destination; 
    string departure; 
    string name; 
    int number; 
    string time; 
 
    void show() const;
};
 
void Airplane::show() const
{
    cout << "____________________________________________________________________________" << endl;
    cout << "Flight number    Name of Plane    Departure    Destination    Departure time" << endl;
    cout << "----------------------------------------------------------------------------" << endl;
}
 
int main()
{
    int n = 15, k, i, size;
    string dep;
    cout << "Enter 1 for write OR 2 for read: ";
    cin >> k;
    Airplane *a = new Airplane[n];
    if (k == 1)
    {
        cout << "Flight number/Name of Plane/Departure/Destination/Departure time" << endl;
        //////////////////////////////////////////////////////
        ofstream fout ("Airport.TXT", ios::app);
        //////////////////////////////////////////////////////
        for (i = 0; i < n; ++i)
        {
            cout << "Flight " << i + 1 << ":" << endl;
            a[i].number = i;    fout << a[i].number << endl;
            cout << "----------------" << endl;
            cout << "Enter name of plane: "; cin >> a[i].name;          fout << a[i].name << endl;
            cout << "Departure in: ";        cin >> a[i].departure;     fout << a[i].departure << endl;
            cout << "Destination in: ";      cin >> a[i].destination;   fout << a[i].destination << endl;
            cout << "Time: ";                cin >> a[i].time;          fout << a[i].time << endl;
            cout << "----------------" << endl;
        }
        //////////////////////////////////////////////////////
        fout.close();
        //////////////////////////////////////////////////////
        delete[] a;
    }
    //////////////////////////////////////////////////////////
    //////////////////////////////////////////////////////////
    if (k == 2)
    {
        //////////////////////////////////////////////////////
        ifstream fin("Airport.TXT");
        //////////////////////////////////////////////////////
        for (i = 0; i < 1; ++i) a[i].show();
        for(i = 0; i < n; ++i)
        {
            fin >> a[i].number;
            fin >> a[i].name;
            fin >> a[i].departure;
            fin >> a[i].destination;
            fin >> a[i].time;
            cout << setw(12) << a[i].number + 1 << setw(15)
                 << a[i].name << setw(15) << a[i].departure
                 << setw(15) << a[i].destination << setw(18)
                 << a[i].time << endl;
            cout << "----------------------------------------------------------------------------" << endl;
        }
        cout << "Enter departure: ";
        cin >> dep;
        for (i = 0; i < 1; ++i) a[i].show();
        for (i = 0; i < n; ++i)
        {
            if (a[i].departure == dep)
                {
                    cout << setw(12) << a[i].number + 1 << setw(15)
                         << a[i].name << setw(15) << a[i].departure
                         << setw(15) << a[i].destination << setw(18)
                         << a[i].time << endl;
                    cout << "----------------------------------------------------------------------------" << endl;
                }
        }
        //////////////////////////////////////////////////////////
        fin.close();
        //////////////////////////////////////////////////////////
        delete[] a;
    }
    system("pause");
    return 0;
}
nmcf, можешь помочь разбить код на подпрограммы, к примеру хочу сделать ещё ф-ю на вывод этого
Кликните здесь для просмотра всего текста
cout << setw(12) << a[i].number + 1 << setw(15)
                 << a[i].name << setw(15) << a[i].departure
                 << setw(15) << a[i].destination << setw(18)
                 << a[i].time << endl;
Но оно не знает что такое "а" и "i" , как это исправить?


Azazel-San

i объявишь в функции, а a, n будешь передавать в неё как параметры.