【发布时间】:2010-11-25 22:13:00
【问题描述】:
我无法在此处刷新 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 name\n");
}
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 name\n");
}
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;
}
输出:
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)
【问题讨论】:
-
仅供参考,将
struct写入文件是不可可移植的。 -
@Andrew,这取决于您对便携式的定义。我假设您的意思是,在这种情况下,不能保证可以在以不同方式填充结构的实现上成功读取结构。你是对的。但是,可移植性可能意味着其他事情,例如“将适用于所有实现”。根据标准,将结构写入文件是完全可移植的,所有符合要求的实现都应该能够做到这一点,如果他们不做改变填充的事情(比如使用 @ 987654328@,例如)。
-
也许可以更好地表述为:仅供参考,
struct可能包含填充,如果您尝试在另一个实现中读取它可能会导致问题,或者即使是相同的实现,具有不同的填充选项。