冲洗输入流C的问题
我不能在这里刷新stdin,有没有办法刷新stdin?如果没有,那么如何让getchar()将一个字符作为用户的输入,而不是输入缓冲区中的scanf留下的“ n”? ?
#include "stdio.h" #include "stdlib.h" int main(int argc,char*argv[]) { FILE *fp; char another='y'; struct emp { char name[40]; int age; float bs; }; struct emp e; if(argc!=2) { printf("please write 1 target file namen"); } fp=fopen(argv[1],"wb"); if(fp==NULL) { puts("cannot open file"); exit(1); } while(another=='y') { printf("nEnter name,age and basic salary"); scanf("%s %d %f",e.name,&e.age,&e.bs); fwrite(&e,sizeof(e),1,fp); printf("Add another record (Y/N)"); fflush(stdin); another=getchar(); } fclose(fp); return 0; }
编辑: - 更新的代码,仍然无法正常工作
#include "stdio.h" #include "stdlib.h" int main(int argc,char*argv[]) { FILE *fp; char another='y'; struct emp { char name[40]; int age; float bs; }; struct emp e; unsigned int const BUF_SIZE = 1024; char buf[BUF_SIZE]; if(argc!=2) { printf("please write 1 target file namen"); } fp=fopen(argv[1],"wb"); if(fp==NULL) { puts("cannot open file"); exit(1); } while(another=='y') { printf("nEnter name,age and basic salary : "); fgets(buf, BUF_SIZE, stdin); sscanf(buf, "%s %d %f", e.name, &e.age, &e.bs); fwrite(&e,sizeof(e),1,fp); printf("Add another record (Y/N)"); another=getchar(); } fclose(fp); return 0; } output for this is :- dev@dev-laptop:~/Documents/c++_prac/google_int_prac$ ./a.out emp.dat Enter name,age and basic salary : deovrat 45 23 Add another record (Y/N)y Enter name,age and basic salary : Add another record (Y/N)y Enter name,age and basic salary : Add another record (Y/N)
更新:您需要在循环结尾添加另一个getchar()以消耗Y / N后面的' n'。 我不认为这是最好的方法,但它会使你的代码按照现在的状态工作。
while(another=='y') {
printf("nEnter name,age and basic salary : ");
fgets(buf, BUF_SIZE, stdin);
sscanf(buf, "%s %d %f", e.name, &e.age, &e.bs);
fwrite(&e,sizeof(e),1,fp);
printf("Add another record (Y/N)");
another=getchar();
getchar();
}
我建议将你想解析的数据(直到并包括' n')读入缓冲区,然后用sscanf()解析出来。 这样你就可以使用换行符,并且可以对数据执行其他的理智检查。
fflush(stdin)
是未定义的行为(a)。 相反,让scanf
“吃”换行符:
scanf("%s %d %fn", e.name, &e.age, &e.bs);
其他人都认为scanf
是一个不错的选择。 相反,你应该使用fgets
和sscanf
:
const unsigned int BUF_SIZE = 1024;
char buf[BUF_SIZE];
fgets(buf, BUF_SIZE, stdin);
sscanf(buf, "%s %d %f", e.name, &e.age, &e.bs);
(a)例如参见C11 7.21.5.2 The fflush function
:
int fflush(FILE *stream)
- 如果流指向输出流或未输入最近操作的更新流,则fflush函数会将该流的所有未写入数据传递到主机环境以写入文件; 否则,行为是不确定的。
用这个代替getchar():
char another[BUF_SIZE] = "y";
while( 'y' == another[0] )
{
printf( "nEnter name,age and basic salary : " );
fgets( buf, BUF_SIZE, stdin );
sscanf( buf, "%s %d %f", e.name, &e.age, &e.bs );
fwrite( &e, sizeof(e) , 1, fp );
printf( "Add another record (Y/N)" );
fgets( another, BUF_SIZE, stdin );
}
链接地址: http://www.djcxy.com/p/54559.html