Запись структуры из файла [дубликат]

149
26 декабря 2019, 12:40
This question already has an answer here:
Сериализация в С++ (1 ответ)
Закрыт 9 месяцев назад.

Нужно было реализовать программу, с сортировкой структуры по разным параметрам быстрым и медленным алгоритмом сортировки. Я с этим всем справился, но есть одно но: вводить всю информацию с клавиатуры долго и не удобно, а пример с файлами я нашел либо очень простые, что мне не подходят, либо с-шным способом. А мне нужен именно с++ способ. Файл и скриншот прилагаюся. И да, сорян за украинский. Переводить некогда

  1. 4512 "Dancig" 14 5.54 28 03 2019
  2. 4513 "Tomaszek" 4 2.3 30 03 2019
  3. 4515 "Semenko" 9 4.05 02 04 2019
  4. 4517 "Savchynko" 3 0.5 03 04 2019
  5. 4518 "Borovych" 12 4.97 01 04 2019
  6. 4516 "Balava" 20 7.3 20 04 2019
  7. 4509 "Timisoara" 10 5 30 04 2019
  8. 4528 "Loievycz" 13 5.2 03 05 2019
  9. 4533 "Orlov" 5 1.35 01 05 2019
  10. 4600 "Kovacskosbal" 22 10.04 09 05 2019

//это должно было записано в файле. Но тут файл прикрепить нельзя((

#include "pch.h"
#include <iostream>
#include <windows.h>
#include <fstream>
#include <string>
using namespace std;
#define T 10
struct Passageer
{
    int biletnum;
    char pas_name[20];
    int bag_things;
    double bag_mas;
    struct
    {
        unsigned int day, month, year;
    } 
    date;
};
void sort_shaker(Passageer**q, int n)
{
    int flag = 1;
    int leftMark = 1;
    int rightMark = n - 1;
    while (leftMark <= rightMark && flag > 0)
    {
        flag = 0;
        for (int i = rightMark; i >= leftMark; i--)
            if (q[i - 1]->bag_mas > q[i]->bag_mas) {
                int buff;
                buff = q[i]->bag_mas;
                q[i]->bag_mas = q[i - 1]->bag_mas;
                q[i - 1]->bag_mas = buff;
                flag = 1;
            }leftMark++;

        for (int i = leftMark; i <= rightMark; i++)
            if (q[i - 1]->bag_mas > q[i]->bag_mas) {
                int buff;
                buff = q[i]->bag_mas;
                q[i]->bag_mas = q[i - 1]->bag_mas;
                q[i - 1]->bag_mas = buff;
                flag = 1;
            }rightMark--;
    }
    for (int i = 0; i < T; i++)
    {
        cout << "Номер квитка: " << q[i]->biletnum << " Прізвище: " << q[i]->pas_name << " Кількість речей в багажі: " << 
        q[i]->bag_things << " Вага багажу: " << q[i]->bag_mas << " Дата прибуття: " << q[i]->date.day << "/" << q[i]->date.month << "/" << q[i]->date.year << endl;
    }
}
void sort_bubble(Passageer**q, int n) {
    for (int i = 0; i < n - 1; i++) {
        for (int j = 0; j < n - i - 1; j++) {
            if (q[j]->biletnum > q[j + 1]->biletnum) {
                Passageer *temp = q[j];
                q[j] = q[j + 1];
                q[j + 1] = temp;
            }
        }
    }
    for (int i = 0; i < T; i++) {
        cout << "Номер квитка: " << q[i]->biletnum << " Прізвище: " << q[i]->pas_name << " Кількість речей в багажі: " << 
        q[i]->bag_things << " Вага багажу: " << q[i]->bag_mas << " Дата прибуття: " << q[i]->date.day << "/" << q[i]->date.month << "/" << q[i]->date.year << endl;
    }
}
void sort_date(Passageer*pas) {
    Passageer sort1[T];
    for (int i = 0; i < T - 1; i++)
    {
        for (int g = i + 1; g < T; g++)
        {
            if (pas[i].date.year * (20 * 50) + pas[i].date.month * 20 + pas[i].date.day > pas[g].date.year *
                (20 * 50) + pas[g].date.month * 20 + pas[g].date.day)
            {
                sort1[1] = pas[i];
                pas[i] = pas[g];
                pas[g] = sort1[1];
            }
        }
    }
    for (int i = 0; i < T; i++)
    {
        cout << "Номер квитка: " << pas[i].biletnum << " Прізвище: " << pas[i].pas_name << " Кількість речей в багажі: " << pas[i].bag_things << " Вага багажу: " << pas[i].bag_mas <<
        " Дата прибуття: " << pas[i].date.day << "/" << pas[i].date.month << "/" << pas[i].date.year << endl;
    }
}
int main() {
    SetConsoleOutputCP(1251);
    SetConsoleCP(1251);
    string path = "list.txt";
    ifstream fin;
    fin.open(path);
    if (!fin.is_open()) {
        cout << "Не вдалось знайти або відкрити файл!";
    }
    fin.close();
    Passageer *pas = new Passageer[T];
    for (int i = 0; i < T; i++) {
        cout << "Заповніть дані пасажира " << i + 1 << endl;
        cout << "Номер квитка: " << endl;
        cin >> pas[i].biletnum;
        cout << "День: ";
        cin >> pas[i].date.day;
        cout << "Місяць: ";
        cin >> pas[i].date.month;
        cout << "Рік: ";
        cin >> pas[i].date.year;
        cout << "Прізвище: " << endl;
        cin >> pas[i].pas_name;
        cout << "Кількість речей в багажі: " << endl;
        cin >> pas[i].bag_things;
        cout << "Вага багажу: " << endl;
        cin >> pas[i].bag_mas;
    }

    Passageer **pas_q = new Passageer*[T];
    for (int i = 0; i < T; i++) {
        pas_q[i] = &pas[i];
    }
    cout << "Відсортувати список за: " << endl << "1. Номером квитка" << endl << "2. Вагою багажу" << endl << 
        "3. Датою прибуття" << endl << "0. Не сортувати" << endl;
    int select;
    cin >> select;
    switch (select)
    {
    case 1:
        sort_bubble(pas_q, T);
        break;
    case 2:
        sort_shaker(pas_q, T);
        break;
    case 3:
        sort_date(pas);
    case 0:
        for (int i = 0; i < T; i++)
        {
            cout << "Номер квитка: " << pas[i].biletnum << " Прізвище: " << pas[i].pas_name << " Кількість речей в багажі: " << pas[i].bag_things << " Вага багажу: " << pas[i].bag_mas <<
                " Дата прибуття: " << pas[i].date.day << "/" << pas[i].date.month << "/" << pas[i].date.year << endl;
        }
    default:
        break;
    }
    return 0;
}
Answer 1

Вот относительно простой способ:

Passageer *readFile(string path)
{
    ifstream fin(path);
    int length = -1;
    char ch;
    while (!fin.eof())
    {
        fin.get(ch);
        if (ch == '\n') length++;
    }
    fin.close();
    if (length == -1)
        return NULL;
    fin.open(path);
    Passageer *passageers = new Passageer[length];
    for (int i = 0; i < length; i++)
    {
        fin >> passageers[i].biletnum >> passageers[i].date.day >> passageers[i].date.month >> passageers[i].date.year >> passageers[i].pas_name >> passageers[i].bad_things >> passageers[i].bag_mas;
    }
    fin.close();
    return passageers;
}

В параметр передаем имя файла. Сначала открываем файл и считываем сколько там строк: в случае если их там нет, то возвращаем null, если определенно количество, то выделяем память в массиве. И потом через цикл записываем этот массив данными из файла. Пример обращения к этому методу:

Passageer *pas = readFile("passageers.txt");
READ ALSO
Не могу корректно записать строку слов C++

Не могу корректно записать строку слов C++

Сделана в принципе вся программа но я не могу сделать ввод слов из клавиатуры

161
Получить список классов

Получить список классов

Задача состоит в том, чтобы написать простой редактор объектов, с возможностью создавать, удалять объекты и редактировать свойства объектов...

152
C++ не выводится вещественное число [дубликат]

C++ не выводится вещественное число [дубликат]

} Выводит целое число, а надо вещественноеЗаранее спасибо

122
Как сохранять данные в файле txt C++

Как сохранять данные в файле txt C++

Дело в том что, мне нужно сохранить данные в файле, таким образом, чтобы оно не перезаписывалось опять, а прибавлялось к имеющему переменному...

175