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

一个关于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之类的,就用你原来的就可以啦!
程序调试完毕;但是能你的设计不够严密;比如输入数据格式
错误没有错误处理;输入应该做检查;提高你程序的健壮程度;
希望能帮到你