#include <stdio.h> #include <stdlib.h> #include <cstring> #include <iostream> #include <clocale> #define FNAME_I "C:\Qt\\bd1.dat" #define FNAME_R "C:\Qt\\bd2.dat" int proverka_file(char *fname, const char *); void dozapolneniye(char *fname); void table(); void table2(); void prosmotrbd1(char *fname); void prosmotrbd2(char *fname); void findname(char *fname1, char *fname2); void sort_name(char *fname); void sort_voz_count_prop(char *fname); const char PR_R[] = "r"; const char PR_S[] = "r+"; const char PR_W[] = "w"; const char PR_A[] = "a"; typedef struct { char tip[10]; char num[7]; int kolich; int chas; int kilom; }str; using namespace std; int main() { int var; char otv; char fname_i[15] = FNAME_I; char fname_r[15] = FNAME_R; setlocale(LC_ALL, "Russian"); for (;;) { cout << "\n Shto sdelat:" << endl; cout << " 1 - sozdaniye bazi dannih" << endl; cout << " 2 - dobavleniye novih zapisey" << endl; cout << " 3 - sortirovka po tipu samoleta" << endl; cout << " 4 - sortirovka po konechnomu naletu" << endl; cout << " 5 - poisk nomera borta" << endl; cout << " 6 - prosmotr bazi dannih" << endl; cout << " 7 - prosmotr bazi dannih po poisku" << endl; cout << " 8 - zaversheniye" << endl; cout << " Vvedite shto nuzhno sdelat ->"; cin >> var; switch (var) { default:break; case 1: if (proverka_file(fname_i, PR_R)) { cout << " Baza dannih " << fname_i; cout << " uzhe sozdana." << endl; cout << " Sozdat noviy fail? [Y/N] "; cin >> otv; cin.get(); if (otv == 'Y' || otv == 'y' || otv == 'Н' || otv == 'н') { cout << " Vvedite novoe imya: "; cin >> fname_i; } else break; } if (!proverka_file(fname_i, PR_W)) { cout << "\n Oshibka otkritiya faila dlya zapisi" << endl; cout << " Dlya prodolzheniya nazhmite Enter->"; getchar(); break; } cout << " Sozdaem bazu " << fname_i << endl; dozapolneniye(fname_i); cout << "\n Sozdaniye faila zakoncheno." << endl; if (proverka_file(fname_i, PR_R)) cout << " Baza dannih gotova k rabote" << endl; else cout << "\n Baza ne sozdana" << endl; cout << " Dlya prodolzheniya nazhmite Enter->"; getchar(); break; case 2: if (proverka_file(fname_i, PR_R)) { cout << " Baza dannih poletov " << fname_i; cout << " bila sozdana ranshe." << endl; cout << " Dovavit noviye zapisi? [Y/N] "; cin >> otv; cin.get(); if (otv == 'N' || otv == 'n' || otv == 'Т' || otv == 'т') { cout << " Vvedite imya drugoy bazi: "; cin >> fname_i; if (!proverka_file(fname_i, PR_R)) { cout << " Takaya baza dannih ne sozdavalas" << endl; cout << " Dlya prodolzheniya nazhmite Enter->"; getchar(); break; } } } cout << " Dobavlyaem zapisi v fail" << fname_i << endl; dozapolneniye(fname_i); cout << "\n Izmeneniye faila zakoncheno."; cout << " Dlya prodolzheniya nazhmite Enter->"; getchar(); break; case 3: if (!proverka_file(fname_i, PR_S)) { cout << "\n Oshibka otkritiya faila dlya chteniya i zapisi" << endl; cout << " Dlya prodolzheniya nazhmite Enter->"; getchar(); break; } sort_name(fname_i); cout << "\n Sortirovka zakonchena."; cout << " Dlya prodolzheniya nazhmite Enter->"; getchar(); break; case 4: if (!proverka_file(fname_i, PR_S)) { cout << "\n Oshibka otkritiya faila dlya chteniya i zapisi" << endl; cout << " Dlya prodolzheniya nazhmite Enter->"; getchar(); break; } sort_voz_count_prop(fname_i); cout << "\n Sortirovka zakonchena."; cout << " Dlya prodolzheniya nazhmite Enter->"; getchar(); break; case 5: if (!proverka_file(fname_i, PR_R)) { cout << "\n Oshibka otkritiya faila dlya chteniya" << endl; cout << " Dlya prodolzheniya nazhmite Enter->"; getchar(); break; } if (!proverka_file(fname_r, PR_W)) { cout << "\n Oshibka otkritiya faila dlya zapisi" << endl; cout << " Dlya prodolzheniya nazhmite Enter->"; getchar(); break; } findname(fname_i, fname_r); cout << "\n Poisk samoleta po nomeru borta."; cout << " Dlya prodolzheniya nazhmite Enter->"; getchar(); break; case 6: if (!proverka_file(fname_i, PR_R)) { cout << "\n Oshibka otkritiya faila dlya chteniya" << endl; cout << " Dlya prodolzheniya nazhmite Enter->"; getchar(); break; } prosmotrbd1(fname_i); cout << "\n Dlya prodolzheniya nazhmite Enter->"; getchar(); break; case 7: if (!proverka_file(fname_r, PR_R)) { cout << "\n Oshibka otkritiya faila dlya chteniya" << endl; cout << " Dlya prodolzheniya nazhmite Enter->"; getchar(); break; } prosmotrbd2(fname_r); cout << "\n Dlya prodolzheniya nazhmite Enter->"; getchar(); break; case 8: return 0; } } } void dozapolneniye(char *fname) { char otv; str s; FILE *baza; baza = fopen(fname, PR_A); rewind(baza); do { cout << "\n Tip samoleta? "; cin >> s.tip; cout << " Nomer borta? "; cin >> s.num; cout << " Kolichestvo reisov? "; cin >> s.kolich; cout << " Nalet v chas? "; cin >> s.chas; cout << " Nalet v kilometrah? "; cin >> s.kilom; fwrite(&s, sizeof(s), 1, baza); cout << "\n Prodolzhit?[Y/N]"; cin >> otv; cin.get(); } while (otv == 'Y' || otv == 'y' || otv == 'Н' || otv == 'н'); fclose(baza); } void table() { int i; cout << "\n"; for (i = 1; i <= 71; i++) cout << "-"; cout << endl; cout << "| Tip samoleta |" << " Num borta |" << " Kolvo reisov |" << " Nalet/chas |" << "Nalet/km|" << endl; for (i = 1; i <= 63; i++) cout << "-"; } void table2() { int i; cout << "\n"; for (i = 1; i <= 71; i++) cout << "-"; cout << endl; cout << "| Tip samoleta |" << " Num borta |" << " Kolvo reisov |" << " Nalet/chas |" << "Nalet/km|" << endl; for (i = 1; i <= 65; i++) cout << "-"; } void prosmotrbd1(char *fname) { int i; str s; FILE *baza; baza = fopen(fname, PR_R); cout << "\n Baza dannih poletov"; table(); rewind(baza); while (fread(&s, sizeof(s), 1, baza) > 0) { cout << "\n|"; cout.width(20); cout << s.tip << "|"; cout.width(9); cout << s.num << "|"; cout.width(9); cout << s.kolich << "|"; cout.width(9); cout << s.chas << "|"; cout.width(17); cout << s.kilom << "|"; } cout << "\n"; for (i = 1; i <= 71; i++) cout << "-"; fclose(baza); } void prosmotrbd2(char *fname) { int i; str s; FILE *baza; baza = fopen(fname, PR_R); cout << "\n Baza dannih poiska po tipu samoleta"; table2(); rewind(baza); while (fread(&s, sizeof(s), 1, baza) > 0) { cout << "\n|"; cout.width(10); cout << s.tip << "|"; cout.width(2); cout << s.num << "|"; cout.width(3); cout << s.kolich << "|"; cout.width(3); cout << s.chas << "|"; cout.width(3); cout << s.kilom << "|"; } cout << endl; for (i = 1; i <= 65; i++) cout << "-"; fclose(baza); } void findname(char *fname1, char *fname2) { char num[7]; str s; FILE *in, *out; in = fopen(fname1, PR_R); out = fopen(fname2, PR_W); cout << "\n Nomer borta dlya poiska? "; cin >> num; rewind(in); while (fread(&s, sizeof(s), 1, in) > 0) if (strncmp(s.num, num, 10) == 0) fwrite(&s, sizeof(s), 1, out); fclose(out); fclose(in); } void sort_name(char *fname) { int i; int fl; str ppp, s; FILE *baza; baza = fopen(fname, PR_S); do{ rewind(baza); fl = 0; for (i = 0; fread(&s, sizeof(s), 1, baza) > 0; i += sizeof(s), fseek(baza, i, SEEK_SET)) if (fread(&ppp, sizeof(s), 1, baza) > 0) if (strncmp(s.tip, ppp.tip, 10) > 0) { fseek(baza, i, SEEK_SET); fwrite(&ppp, sizeof(s), 1, baza); fwrite(&s, sizeof(s), 1, baza); fl = 1; } } while (fl); fclose(baza); } void sort_voz_count_prop(char *fname) { int i, fl; str ppp, s; FILE *baza; baza = fopen(fname, PR_S); do{ rewind(baza); fl = 0; for (i = 0; fread(&s, sizeof(s), 1, baza) > 0; i += sizeof(s), fseek(baza, i, SEEK_SET)) if (fread(&ppp, sizeof(s), 1, baza) > 0) if (s.kilom > ppp.kilom) { fseek(baza, i, SEEK_SET); fwrite(&ppp, sizeof(s), 1, baza); fwrite(&s, sizeof(s), 1, baza); fl = 1; } } while (fl); fclose(baza); } int proverka_file(char *fname, const char *pr) { if ((fopen(fname, pr)) == NULL) return 0; return 1; } 
  • one
    It would be nice if you still provide the text of the error itself, and the line number in which the error occurs. - Sergey Glazirin
  • Oshibka otkritiya faila dlya zapisi - displayed in the console itself. The database is being created, but it cannot be opened for reading or writing. - Catherine
  • one
    @ Ekaterina, you have Qt here and it does not smell. All code is in pure C ++, and working with files is entirely at C. I think these tags will be more appropriate - yrHeTaTeJlb
  • 2
    Here in the proverka_file file opens, and who will close it? - KoVadim
  • one
    By the way, the file names in the macros are not quite correct. #define FNAME_I "C:\Qt\\bd1.dat" #define FNAME_R "C:\Qt\\bd2.dat" - double slashes are needed. Otherwise, this is the wrong folder - KoVadim

0