问题描述
我无法在这里刷新 stdin,有没有办法刷新它?如果不是,那么如何让 getchar()
将一个字符作为用户的输入,而不是输入缓冲区中 scanf()
留下的"??
I am not able to flush stdin here, is there a way to flush it? If not then how to make getchar()
to take a character as input from user, instead of a "" left by scanf()
in the input buffer??
#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 name
");
}
fp=fopen(argv[1],"wb");
if(fp==NULL) {
puts("cannot open file");
exit(1);
}
while(another=='y') {
printf("
Enter 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;
}
更新的代码,仍然无法正常工作
updated code, still not working properly
#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 name
");
}
fp=fopen(argv[1],"wb");
if(fp==NULL) {
puts("cannot open file");
exit(1);
}
while(another=='y') {
printf("
Enter 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;
}
输出:
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 后面的 ''.我不认为这是最好的方法,但它会让你的代码像现在一样工作.
Update: You need to add another getchar() at the end of your loop to consume the '' that follows the Y/N. I don't think this is the best way to go, but it will make your code work as it stands now.
while(another=='y') {
printf("
Enter 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();
}
我建议将您要解析的数据(直到并包括")读入缓冲区,然后使用 sscanf() 将其解析出来.这样您就可以使用换行符,并且可以对数据执行其他完整性检查.
I would suggest reading the data you want to parse (up to and including the '') into a buffer and then parse it out using sscanf(). This way you consume the newline and you can perform other sanity checks on the data.
这篇关于如何在 C 中刷新输入流?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!