i973635025
李海成
采纳率33.3%
2015-02-02 11:58

一个关于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条回答

  • qq_15567051 青青河边草悠悠并不老 6年前

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

    点赞 评论 复制链接分享
  • u011767611 Landpack 6年前
    #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之类的,就用你原来的就可以啦!
    程序调试完毕;但是能你的设计不够严密;比如输入数据格式
    错误没有错误处理;输入应该做检查;提高你程序的健壮程度;
    希望能帮到你

    点赞 评论 复制链接分享

相关推荐