一个关于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);
}
}
}
在你的scanf前清一下输入的缓存,否则将自动接收到上一次的'\n' , 用 fflush(stdin);试试
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#define N 3
//declare first before you called
long get_file_size(const char * filename);
void show();
void input();//录入学生信息
void dele();//删除学生信息
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[4];
int ii;
struct student s;
FILE *fp;
//do{
if((fp=fopen("./student.txt","a"))==NULL)//这里我用的是linux系统,我打开当前目录下的文件student.txt
{
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("%s",i);//就是这句,每次都会被跳过,不知道为什么
//getc(c);
//putchar(i)
// ii=(int)i;//ascii/code/
// if(strcmp(i,"y"))
// continue;
// else
// break;
//}while(1);
}
void dele()//删除学生信息
{
}
void change()//改正学生信息
{
}
void search()//查询学生成绩
{
long i,size_file,size_one_group,num_group;
struct student s;
int num;
FILE *fp;
size_file=get_file_size("./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("./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(const 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;
}
int main()
{
int choice;
char option[4];
show();
while(1)
{
printf("请输入操作号:");
scanf("%d",&choice);
switch(choice)
{
case 1:
//do{
// input();
printf("是否继续录入学生信息:y(继续)/n(不继续)\n");
scanf("%s",option);//就是这句,每次都会被跳过,不知道为什么
if(strcmp(option,"y")||strcmp(option,"Y")){
input();
continue;
}else
break;
// }while(1);
// break;
case 2:
break;
case 3:
break;
case 4:
search();
break;
case 5:
break;
case 6:
exit(0);
}
}
return 0;
}
注意我的目录使用的是linux当前目录;你使用的是window系统
你的目录应该是F/:student.txt之类的,就用你原来的就可以啦!
程序调试完毕;但是能你的设计不够严密;比如输入数据格式
错误没有错误处理;输入应该做检查;提高你程序的健壮程度;
希望能帮到你