李海成 2015-02-02 11:58 采纳率: 33.3%
浏览 2090
已采纳

一个关于C语言scanf,和文件读写的问题

下面这段程序出了点问题void input()中无法对char i进行赋值,就是这句 scanf("%c",&i);在下面已被标出,在运行时会被跳过,我总是看不出什么毛病,想求您给看一眼;

另外还有个问题,这个函数void search()//查询学生成绩有个毛病,也已标出,请老师给看一下。

#include"stdio.h"
#include"string.h"
#include"stdlib.h"
#define N 3
struct student
{
long num;
char name[20];
int age;
char department[20];
int grade[3];
int sum;
float ave;
};

void show()
{
printf("**************************************\n");
printf("学生成绩管理系统\n");
printf("1.录入学生信息\n");
printf("2.删除学生信息\n");
printf("3.改正学生信息\n");
printf("4.查询学生成绩\n");
printf("5.输出班级学生的成绩单(总分从高到低)\n");
printf("6.退出\n");
printf("**************************************\n");
}
void input()//录入学生信息
{
char i;
int ii;
struct student s;
FILE *fp;
do
{
if((fp=fopen("d:\student.txt","a"))==NULL)
{
printf("Can not open file!");
exit(0);
}
printf("输入学生信息(学号、姓名、年龄、专业班级、3门课成绩),以空格分隔\n");
scanf("%ld %s %d %s %d %d %d",&s.num,s.name,&s.age,s.department,&s.grade[0],&s.grade[1],&s.grade[2]);
fprintf(fp,"%ld %s %d %s %d %d %d\n",s.num,s.name,s.age,s.department,s.grade[0],s.grade[1],s.grade[2]);

fclose(fp);
printf("是否继续录入学生信息:y(继续)/n(不继续)\n");
scanf("%c",&i);//就是这句,每次都会被跳过,不知道为什么
ii=(int)i;
}
while(ii=='y');

}
void dele()//删除学生信息
{

}
void change()//改正学生信息
{
}
void search()//查询学生成绩
{
long num,i,size_file,size_one_group,num_group;
struct student s;
FILE *fp;
size_file=get_file_size("d:\student.txt");//此处我将文件的大小计算出来,也不知道对不对,也请老师看一下
size_one_group=4*sizeof(int)+41*sizeof(char)+sizeof(long);//这里本来是一组数据的大小,就存了这些s.num,s.name,s.age,s.department,s.grade[0],s.grade[1],s.grade[2])所以分别计算了,可是算出来的大小是61,比文件大小还大,如图,我猜可能是因为其中有两个char类型的数组,在输入的时候并未占满,不知道是怎么回事,,也不知道怎么解决,请老师帮忙看一下。
num_group=size_file/size_one_group;
if((fp=fopen("d:\student.txt","r+"))==NULL)
{
printf("Can not open file!");
exit(0);
}
printf("请输入所需要查询的学号:");
scanf("%d",&num);
for(i=0;i<num_group;i++)
{
fscanf(fp,"%ld %s %d %s %d %d %d",&s.num,s.name,&s.age,s.department,&s.grade[0],&s.grade[1],&s.grade[2]);
if(s.num==num)
{
printf("该同学的三科成绩分别为:%d,%d,%d",s.grade[0],s.grade[1],s.grade[2]);
continue;
}
else
{
break;
}
}
fclose(fp);
}
void output()//输出班级学生的成绩单(总分从高到低)
{}
long get_file_size(char *filename)
{
long i;
FILE *fp;
if((fp=fopen(filename,"r+"))==NULL)
{
printf("Can not open file!");
exit(0);
}
fseek(fp,0L,SEEK_END);
i=ftell(fp);
fclose(fp);
return i;
}
void main()
{
int choice;
show();
while(1)
{
printf("请输入操作号:");
scanf("%d",&choice);
switch(choice)
{
case 1:
input();
break;
case 2:

break;

case 3:

break;

case 4:
search();
break;
case 5:

break;

case 6:
exit(0);
}
}
}

  • 写回答

2条回答 默认 最新

  • 关注

    在你的scanf前清一下输入的缓存,否则将自动接收到上一次的'\n' , 用 fflush(stdin);试试

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥15 逻辑谓词和消解原理的运用
  • ¥15 三菱伺服电机按启动按钮有使能但不动作
  • ¥15 js,页面2返回页面1时定位进入的设备
  • ¥50 导入文件到网吧的电脑并且在重启之后不会被恢复
  • ¥15 (希望可以解决问题)ma和mb文件无法正常打开,打开后是空白,但是有正常内存占用,但可以在打开Maya应用程序后打开场景ma和mb格式。
  • ¥20 ML307A在使用AT命令连接EMQX平台的MQTT时被拒绝
  • ¥20 腾讯企业邮箱邮件可以恢复么
  • ¥15 有人知道怎么将自己的迁移策略布到edgecloudsim上使用吗?
  • ¥15 错误 LNK2001 无法解析的外部符号
  • ¥50 安装pyaudiokits失败