Читання структури з файлу

// VS 2019

#define _CRT_SECURE_NO_WARNINGS

#include <iostream>

#include <stdio.h>

#include <conio.h>

#include <io.h>

#include <fcntl.h>

//#include <sys\stat.h>

#include <stdlib.h>

using namespace std;

struct Transport {

char vyd[10];

char marshrut[10];

float protyazhnist;

int chas;

};

int SMON = 28;

static int file;  /* файл-таблиця */

  /**** Відкрити чи створити файл ****/

void initf(char* fname) {

if (_access(fname, 0) < 0) {

/* не існує файлу - створити */

_fmode = O_BINARY;

if ((file = _creat(fname, S_IREAD | S_IWRITE)) < 0) {

printf("Can't create file %s\n", fname);

_getch();

}

}

else /* існує файл - відкрити */

if ((file = _open(fname, O_RDWR | O_BINARY)) < 0) {

printf("Can't open file %s\n", fname);

_getch();

}

}

/**** закрити файл ***/

void commit() {

_close(file);

}

/**** додати в кінець файлу ****/

void f_add(Transport* a) {

_lseek(file, 0, SEEK_END);

_write(file, a, SMON);

}

/**** перевірка ****/

int fcheck_number(int n) {

long nn;

if (n < 1) {

printf("Мінімальний номер : 1\n");

return -1;

}

nn = _lseek(file, 0, SEEK_END) / SMON;

if (n > nn) {

printf("Максимальний номер :%d\n", (int)nn);

return -1;

}

return 0;

}

void show_1(Transport* x) {

cout << "Vyd: " << x->vyd << endl;

cout << "Marshrut: " << x->marshrut << endl;

cout << "Protyazhnist: " << x->protyazhnist << endl;

cout << "Chas: " << x->chas << endl << endl;

}

/**** виведення одного запису ****/

void fshow_1(int n) {

long t;

Transport x;

t = n - 1; t *= SMON;

_lseek(file, t, SEEK_SET);

_read(file, &x, SMON);

show_1(&x);

}

/**** виведення усіх записів ****/

void fshow_all() {

Transport x;

_lseek(file, 0, SEEK_SET);

// print_head();

while (_read(file, &x, SMON)) {

show_1(&x);

};

}

/**** видалення запису ****/

void fdel_item(int n) {

long t;

Transport x;

t = n; t *= SMON;

_lseek(file, t, SEEK_SET);

while (_read(file, &x, SMON)) {

t = _lseek(file, t - SMON, SEEK_SET);

_write(file, &x, SMON);

t = _tell(file);

t = _lseek(file, SMON, SEEK_CUR);

}

_chsize(file, t - SMON);

}

/**** главна функція ****/

int main() {

setlocale(LC_ALL, "Ukrainian");

Transport x;

//cout << sizeof(x) << endl;

int op;         /* операція */

int num;     /* номер елемента */

char eoj;   /* кінець файлу */

char file[] = "1.txt";

/* відкриття файлу */

initf(file);

for (eoj = 0; !eoj; ) {

/* вивод меню */

printf("1 - Додати елемент\n");

printf("2 - Видалити елемент\n");

printf("3 - Показати елемент за номером\n");

printf("4 - Показати все\n");

printf("0 - Вийти\n");

printf("Введiть >");

/* вибір меню  */

scanf("%d", &op);

switch (op) {

case 0:

eoj = 1;

break;

case 1: /* додати */

  

cout << "Vyd: ";

cin.ignore();

_flushall();

cin.getline(x.vyd, sizeof(x.vyd));

cout << "Marshrut: ";

cin.getline(x.marshrut, sizeof(x.marshrut));

cout << "Protyazhnist: ";

scanf("%f", &x.protyazhnist);

cout << "Chas: ";

scanf("%i", &x.chas);

f_add(&x);

break;

case 2:  /* видалити */

cout << "Vvedit nomer: ";

scanf("%i", &num);

if (fcheck_number(num) != -1) {

fdel_item(num);

}


break;

case 3:  /* показати один */

cout << "Vvedit nomer: ";

scanf("%i", &num);

if (fcheck_number(num) != -1) {

fshow_1(num);

}

break;

case 4: /* показати все */

fshow_all();

break;

default:

printf("Неправильна операцiя\n");

break;

}

if (op) {

printf("Натиснiть будь-яку клавiшу\n");

_getch();

}  /* if */

}  /* for */

   /* закрити файл */

commit();

return 0;

}  /* main */