在C中有效刷新输入流

时间:2018-12-21 12:06:53

标签: c input flush

我正在编写一个原始数据库,该数据库存储,读取和更改由最大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;}

0 个答案:

没有答案