Читання структури з файлу
// 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 */