我正在编写一个原始数据库,该数据库存储,读取和更改由最大31个长度的字符串和一个双精度数组成的数据。当用户输入长度超过31个字符的字符串时,我在错误处理方面遇到问题。我的程序识别出错误,打印出错误消息并跳过该操作,但是继续从用户输入的内容中读取信息。这是有问题的,因为在开始时是通过不同的字符将命令分配给程序的(我不能更改它,因为这是一个作业问题)。
我尝试使用fflush(),但是显然不起作用,并且使用gets()读取其余的输入并将其丢弃,但是我的编译器拒绝了此功能,我想是因为它不安全。 / p>
如何在不中止程序的情况下正确处理此问题?
其余代码按预期工作。
这是我的代码供参考:
#include <stdio.h>
#include <assert.h>
#include <time.h>
typedef struct { //data in my database is in this type
char naziv[32];
double vrijednost;
} record;
int main(){
char o;
unsigned long j=0;
record r;
int dulj=sizeof(r);
//char glup[1024];
FILE *data;
FILE *log;
char ime[15];
time_t rawtime;
struct tm *info;
time( &rawtime );
info = localtime( &rawtime );
strftime (ime, 13, "log_%d%m%Y.txt",info);
data=fopen("data.bin","ab"); assert(data!=NULL);
assert(fclose(data)==0);
data=fopen("data.bin","rb+"); assert(data!=NULL);
log=fopen(ime,"a"); assert(log!=NULL);
if(fseek(data, 0, SEEK_END)!=0){printf("fatalna greška\n");fprintf(log,"\t-greška\n");fflush(NULL);fclose(data); fclose(log);return 0;}
printf("naredbe:\na\tucita input i upise u datoteku\nr\tucita broj ispise vrijednost na tpj poziciji\nw\tucita broj i input i upise na tu poziciju\nc\tzatvori program\n\n");
while(1){
scanf(" %c",&o);
if(o=='a'){
if(fseek(data, 0, SEEK_END)!=0){printf("fatalna greška\n");fprintf(log,"\t-greška\n");fflush(NULL);fclose(data); fclose(log);return 0;}
if(scanf(" %31[^,], %lf", r.naziv, &r.vrijednost)!=2){printf("greška pri unosu\n");gets();continue;}
fprintf(log,"a %s\t%lf\n",r.naziv,r.vrijednost);
fflush(NULL);
if(fwrite(&r,dulj,1,data)!=1){printf("greška pri zapisivanju\n"); fprintf(log,"\t-greška\n");fflush(NULL);continue;}
continue;
}
else if (o=='r'){
scanf(" %lu",&j);
fprintf(log,"r %lu\n",j);
fflush(NULL);
if(fseek(data,j*dulj,SEEK_SET)!=0){printf("greška pri traženju pozicije\n");fprintf(log,"\t-greška\n");fflush(NULL);if(fseek(data, 0, SEEK_END)!=0){printf("fatalna greška\n");fprintf(log,"\t-greška\n");fflush(NULL);fclose(data); fclose(log);return 0;} continue;}
if(fread(&r,dulj,1,data)!=1){printf("greška pri čitanju\n");fprintf(log,"\t-greška\n");fflush(NULL);continue;}
printf("%s %lf\n", r.naziv, r.vrijednost);
if(fseek(data, 0, SEEK_END)!=0){printf("fatalna greška\n");fprintf(log,"\t-greška\n");fflush(NULL);fclose(data); fclose(log);return 0;}
continue;
}
else if (o=='w'){
scanf(" %lu",&j);
if(scanf(" %31[^,], %lf", r.naziv, &r.vrijednost)!=2){printf("greška pri unosu\n");gets();continue;}
fprintf(log,"w %lu %s\t%lf\n",j,r.naziv,r.vrijednost);
fflush(NULL);
if(fseek(data,j*dulj,SEEK_SET)!=0){printf("greška pri traženju pozicije\n");fprintf(log,"\t-greska\n");fflush(NULL);continue;}
if(fwrite(&r,dulj,1,data)!=1){printf("greška pri zapisivanju\n"); fprintf(log,"\t-greska\n");fflush(NULL);continue;}
if(fseek(data, 0, SEEK_END)!=0){printf("fatalna greška\n");fprintf(log,"\t-greška\n");fflush(NULL);fclose(data); fclose(log);return 0;}
continue;
}
else if (o=='c'){fprintf(log,"c\n");fflush(NULL); fclose(data); fclose(log); return 0;}
else printf("nepoznata naredba\n");
}
return 0;}