Нужно создать файл, содержащий инфу о сотрудниках: табельный номер, ФИО, должность, дата рожд:день, мес, год;пол. Нужно:
а) обеспечить ввод данных в файл, проверяя корректность вводимых значений:
- таб. номер. в диап. от 1 до 999;
- таб. номер не должен повторяться;
- дата рождения должна быть корректной.
Ошибочные данные записывать в другой файл - файл ошибок, при ошибке выводить сообщение-предупреждение.
б) Упорядочить файл по табельному номеру.
Я сделала задачу с использованием светового меню, упорядочиваение файла работает, но он не проверяет на корректность и не записывает некорректно введенные структуры в файл ошибок. Место которое не работает я взяла в комментарий. Помогите пожалуйста исправить
мой код:
Код:
#include<stdio.h>
#include<conio.h>
#include<string.h>
#include<stdlib.h>
#define n 5
FILE *fl;
FILE *g;
struct data
{
int den;
int mes;
int god;
};
struct sotr
{
int nom;
char fio[30];
char dolg[30];
struct data dat;
char pol[5];
}sot,sot1,temp,temp1;
struct oshibka
{
int nom;
char text[20];
char fio[30];
char dolg[30];
struct data dat;
char pol[5];
} osh;
void sozdanie()
{
int f,otv;
g=fopen("oshibka.dat","w");
if(g==NULL)
{
printf("Oshibka");
exit(1);
}
fl=fopen("sotr.dat","w");
if(fl==NULL)
{
printf("Oshibka");
exit(1);
}
do
{
printf("\nVvedite tabelnyj nomer sotrydnika: ");
scanf("%d",&sot.nom);
fflush(stdin);
printf("\nVvedite FIO sotrydnika: ");
gets(sot.fio);
fflush(stdin);
printf("\nVvedite dolgnost ");
gets(sot.dolg);
printf("\nVvedite den rogdenia sotrydnika: ");
scanf("%d",&sot.dat.den);
printf("\nVvedite mesyac rogdenia sotrydnika: ");
scanf("%d",&sot.dat.mes);
printf("\nVvedite god rogdenia sotrydnika: ");
scanf("%d",&sot.dat.god);
fflush(stdin);
printf("\nVvedite pol sotrydnika ");
gets(sot.pol);
if (sot.nom<1||sot.nom>999)
{
printf("\nNekorrektno vveden nomer sotrudnika");
strcpy(osh.text,"nekorrektnii nomer");
f=1;
}
/*else
{
fseek(fl,0L,SEEK_SET);
while(fread(&sot1,sizeof(sotr),1,fl)>0)
if (sot1.nom==sot.nom)
{
printf("\nNekorrektno vveden nomer sotrudnika");
strcpy(osh.text,"povtoryaucshiisa nomer");
f=1;
}
switch (sot.dat.mes)
{
case 1:case 3:case 5:case 7:case 8:case 10:case 12:
if (sot.dat.den>31||sot.dat.den<1)
f=1;break;
case 4:case 6:case 9:case 11:
if (sot.dat.den>30||sot.dat.den<1)
f=1;break;
case 2:
{ if (sot.dat.god%4==0)
if (sot.dat.den<1||sot.dat.den>29)
f=1;
if (sot.dat.god%4!=0)
if (sot.dat.den<1||sot.dat.den>28)
f=1;}break;
}
default: f=1;
}
*/
if (f==1)
fwrite(&osh,sizeof(oshibka),1,g);
else
fwrite(&sot,sizeof(sotr),1,fl);
printf("\nProdolgenie - lubaya klavisha");
printf("\nKonec - ESC");
otv=getch();
}
while(otv!=27);
fclose(fl);
}
void vivod()
{
fl=fopen("sotr.dat","r");
printf("\nnomer FIO dolgnost Data rogdenia pol ");
while(fread(&sot,sizeof(sotr),1,fl)>0)
printf("\n\n%-8d%-13s%-19s%-5d%-5d%-9d%-5s",sot.nom,sot.fio,sot.dolg,sot.dat.den,sot.dat.mes,sot.dat.god,sot.pol);
fclose(fl);
getch();
}
void vivod_1()
{
g=fopen("oshibka.dat","r");
printf("\nnomer FIO dolgnost Data rogdenia pol ");
while(fread(&osh,sizeof(oshibka),1,g)>0)
printf("\n\n%-8d%-13s%-19s%-5d%-5d%-9d%-5s",osh.nom,osh.fio,osh.dolg,osh.dat.den,osh.dat.mes,osh.dat.god,osh.pol);
fclose(g);
getch();
}
void sort()
{
fl=fopen("sotr.dat","r+");
while (fread(&sot,sizeof(sotr),1,fl)>0)
{
while(fread(&temp,sizeof(sotr),1,fl)>0)
if(sot.nom<temp.nom)
{
fseek(fl,-(2*sizeof(sotr)),SEEK_CUR);
temp1=sot;
sot=temp;
temp=temp1;
fseek(fl,(-sizeof(sotr)),SEEK_CUR);
fwrite(&sot,sizeof(sotr),1,fl);
}
}
fclose(fl);
vivod();
getch();
}
int menu (int uk)
{
char *men[n]={"Sozdanie faila","Prosmotr","Prosmotr faila oshibok","Sortirovka","Vihod"};
int extended, otv, pred, i;
textcolor(RED);
textbackground(GREEN);
clrscr();
for(i=0;i<n;i++)
{
gotoxy(15,10+i);
puts(men[i]);
}
do
{
textcolor(WHITE);
gotoxy(15,10+uk);
clreol();
puts(men[uk]);
pred=uk;
otv=getch();
extended=0;
if(!otv)extended=getch();
if(extended)
{
switch(extended)
{
case 72:uk--;break;
case 80:uk++;break;
}
if (uk<0) uk=n-1;
if (uk>n-1)uk=0;
textcolor(RED);
gotoxy(15,10+pred);
clreol();
puts(men[pred]);
}
}
while(otv!=13);
return uk;
}
void main()
{
int otv,ukaz=0;
while (ukaz!=n-1)
{
ukaz=menu(ukaz);
switch(ukaz)
{
case 0:clrscr();sozdanie();getch();break;
case 1:clrscr();vivod();getch();break;
case 2:clrscr();vivod_1();getch();break;
case 3:clrscr();sort();getch();break;
case 4:break;
}
}
}