关于c语言文件问题fclose() 输出链表中内容

luxu 发布于 2012/12/18 15:36
阅读 653
收藏 0
#include <cstdlib>
#include <iostream>
#include <string.h>
#include <stdio.h>
#include <conio.h>
struct student
{
char xuehao[15];
char xingming[20];
char xingbie[5];
char nianling[5];
char jiguan[30];
char xibie[30];
char zhuanye[20];
char banji[15];
struct student *next;
};


struct st
{
struct student *head;
int length;
};


void output_student(struct student *p)
{
int n;
printf("%-10s|",p->xuehao);
printf("%-10s|",p->xingming);
printf("%-7s|",p->xingbie);
printf("%-8s|",p->nianling);
printf("%-7s|",p->jiguan);
printf("%-8s|",p->xibie);
printf("%-8s|",p->zhuanye);
printf("%s|",p->banji);
printf("\n");
    for(n=1;n<=80;n++)
    printf("-");
}


int output_surface()
{
     system("cls");//清屏函数;           
     printf("\n%s","*");
     printf("*************************************************");
     printf("\n%s","*");printf("***************学生学籍管理系统******************\n");
     printf("\n%s","(1) ");printf("信息输入(INPUT)");
     printf("\n%s","(2) ");printf("信息修改 (AMEND)");
     printf("\n%s","(3) ");printf("信息删除(DELETE)"); 
     printf("\n%s","(4) ");printf("信息查找(FIND)");
printf("\n%s","(5) ");printf("信息输出(OUTPUT)");
printf("\n%s","(6) ");printf("退出(EXIT)");
printf("\n%s","请选择您要进行的操作并确认...\n"); 
printf("\n%15") ;
int n;
     scanf("%d",&n);
     getchar();
     while(n<1||n>7)
     {
   printf("\n%15s","*");
printf("输入错误,请重新输入...");
printf("%d",&n);

     system("cls");//清屏函数;  
     return n;
}


int  insert_info(struct st &STU)//插入新学生信息;
{
printf("请依次输入学生信息...\n");
struct student *p=NULL,*p1=NULL;
p=(struct student *)malloc(sizeof(struct student));
printf("学号  :");
scanf("%s",p->xuehao);
p1=STU.head;
while(p1)
    {
      if(strcmp(p1->xuehao,p->xuehao)==0)
      {
    printf("该学生已经存在\n");goto L;
      }
      p1=p1->next;
    }  
    printf("姓名  :"); scanf("%s",&p->xingming);
    printf("性别  :"); scanf("%s",&p->xingbie);
    printf("年龄  :"); scanf("%s",&p->nianling);
    printf("籍贯  :"); scanf("%s",&p->jiguan);
    printf("系别  :"); scanf("%s",&p->xibie);
    printf("专业  :"); scanf("%s",&p->zhuanye);
    printf("班级  :"); scanf("%s",&p->banji);
    p->next=NULL;
p->next=STU.head;
STU.head=p;
    system("cls");
    printf("添加成功\n");
    printf("您所添加的学生信息为:\n\n");
    STU.length++;
    printf("学号      |姓名     |性别    |年龄    |籍贯   |系别    |专业    |班级\n");
    int i;
    for(i=1;i<=80;i++)
    printf("-");
    output_student(p);
    L:;
    printf("按任意键返回...\n");
getch();
int k; 
k=output_surface();
return k;



int output_info(struct st STU)//输出所有学生信息;
{
printf("请选择每页要显示的信息数,最多15条...\n");
int n;scanf("%d",&n);
while(n<1||n>15)
    {
    printf("输入错误,请重新输入...\n");scanf("%d",&n);
}
    system("cls");
    if( STU.length==0)
    {
   printf("系统中没有信息\n");
        printf("按任意键返回...\n");
getch();
int k; 
k=output_surface();
return k;
    }


    struct student *p1;//信息的输出
    p1=STU.head;
    int count;
    int i;
    while(p1)
    {
      system("cls");
    printf("学号      |姓名     |性别    |年龄    |籍贯   |系别    |专业    |班级\n");
    for(i=1;i<=80;i++) printf("-");
    count =n;
    while((count--)&&(p1))
    {
      output_student(p1);p1=p1->next;
    }
    printf("按确认键翻页...\n"); getch();
    } 
    printf("按任意键返回...\n");
getch();
int k; 
k=output_surface();
return k;
}




int find_info(struct st STU)// 查询学生信息;
{
system("cls");
struct student *p1=(struct student *)malloc(sizeof(struct student));
struct student *p2=STU.head; 
printf("请输入学号...\n");
scanf("%s",&p1->xuehao);
while(p2)
{
if(strcmp(p1->xuehao,p2->xuehao)==0) break;p2=p2->next;
}

if(!p2)
{
printf("没有找到该学生\n"); 
printf("按任意键返回...\n");
getch();
int k; 
k=output_surface();
return k;
}
else
{
system("cls");
printf("    您所查询的学生信息    *\n\n");
printf("学号         |姓名         |性别      |年龄    |籍贯   |系别    |专业    |班级\n");
int i;
for(i=1;i<=80;i++) printf("-");
output_student(p2);
printf("按任意键返回...\n");
getch();
int k; 
k=output_surface();
return k;
}









int student_amend(struct st &STU)
{
system("cls");
struct student *p1=(struct student *)malloc(sizeof(struct student));
struct student *p2=STU.head;
printf("请输入要修改的学号\n");
scanf("%s",p1->xuehao);
    while(p2) 
    {
    if(strcmp(p1->xuehao,p2->xuehao)==0) break;p2=p2->next;
    }
    if(!p2)
{
printf("没有找到该学生\n"); 
printf("按任意键返回...\n");
getch();
int k; 
k=output_surface();
return k;
}
else
{
printf("请输入修改的内容\n1 :姓名,2:性别, 3:年龄, 4:籍贯, 5:系别, 6:专业, 7:班级\n");
int g;
 A:scanf("%d",&g);
switch(g)
{
case 1:printf("请输入姓名  :"); getchar();scanf("%s",p2->xingming);break;
case 2:printf("请输入性别  :"); getchar();scanf("%s",p2->xingbie);break;
case 3:printf("请输入年龄  :"); getchar();scanf("%d",&p2->nianling);break;
case 4:printf("请输入籍贯  :"); getchar();scanf("%s",p2->jiguan);break;
case 5:printf("请输入系别  :"); getchar();scanf("%s",p2->xibie);break;
case 6:printf("请输入专业  :"); getchar();scanf("%s",p2->zhuanye);break;
case 7:printf("请输入班级  :"); getchar();scanf("%s",p2->banji);break;
default :printf("输入错误,请重新输入\n");goto A; 

system("cls");
printf("您修改后的学生信息是    *\n\n");
printf("学号      |姓名     |性别    |年龄    |籍贯   |系别    |专业    |班级\n");
int i;
for(i=1;i<=80;i++) printf("-");
output_student(p2);
printf("按任意键返回...\n");
getch();
int k; 
k=output_surface();
return k;
}

    








int  student_delete(struct st &STU)
{
system("cls");
struct student *p2,*p3;
p2=STU.head;
printf("请输入要删除的学生的学号...\n");
char xuehao[20];
int m=0;
scanf("%s",xuehao);
    while(p2) 
    {
    if(strcmp(xuehao,p2->xuehao)==0) 
break;
m++;
p3=p2;
p2=p2->next;
    }
    if(!p2)
{
printf("没有找到该学生\n"); 
printf("按任意键返回...\n");
getch();
int k; 
k=output_surface();return k;
}
else
{
if(m==0)
STU.head=p2->next;
else
p3->next=p2->next;
free(p2);
printf("删除成功!\n");
   return 5;

}




void putout_student_file(struct st STU)
{
FILE *fp;
struct student *p1;
p1=STU.head;
fp=fopen("学生学籍管理.txt","a");
if(fp==NULL)
{
  printf("Cannot open the file!\n");getch();exit(1);
  }  
  while(p1)
  {
  fputs(p1->xuehao,fp);fputs("         ",fp);
  fputs(p1->xingming,fp);fputs("         ",fp);
  fputs(p1->xingbie,fp);fputs("        ",fp);
  fputs(p1->nianling,fp);fputs("        ",fp);
  fputs(p1->jiguan,fp);fputs("       ",fp);
  fputs(p1->xibie,fp);fputs("        ",fp);
  fputs(p1->zhuanye,fp);fputs("        ",fp);
  fputs(p1->banji,fp);fputs("        \n",fp);
  p1=p1->next;
  }
  //fclose(fp);////////////////////////////////////////////////////////////////////这里加fclose(fp)为什么不能输出???
}




int main(int argc, char *argv[])
{
     FILE *fp;
if((fp=fopen("学生学籍管理.txt","w"))==NULL)
{
  printf("Cannot open the file!\n");getch();exit(1);
  }
    fputs("           *************************************************\n",fp);
    fputs("           ***************学生学籍管理系统******************\n",fp);
    fputs("学号      |姓名     |性别    |年龄    |籍贯   |系别    |专业    |班级\n",fp);
struct st STU;
int n=output_surface();
STU.head=NULL;
STU.length=0;
while(1)
{
switch(n)
{
case 1:n=insert_info(STU);
break;
case 2:n=student_amend(STU);
break;
case 3:n=student_delete(STU);
   break;
   case 4:n=find_info(STU);
   break;
case 5:n=output_info(STU);
   break;
case 6:putout_student_file(STU); fclose(fp); goto H;
   break;
}
}
H:return 0;
}
加载中
0
中山野鬼
中山野鬼

引用来自“luxu”的答案

引用来自“中山野鬼”的答案

什么叫做“ fclose(fp)为什么不能输出??? ”
我试过输入几个数,结束后我打开那个文件没有我输入的内容,把它去掉后就可以了,不明白为什么??

就是嘛,你说清楚点。我猜都能猜出什么问题。你肯定是重复掉用了这个函数。而第二次调用由于链表空,所以没有输出。你不信,可以常识把fopen改成追加。那么东西就可以进去。

当然核心问题是要解决为什么第二次会调用的问题。如果逻辑不可回避,你需要在这个函数里增加进入位置的状态判断。以判断没意义的调用不进行文件操作。这是架构设计的错误导致。

如果我说错了。我立贴道歉。哈。以示我下面话的收回“那么烂的代码,扔掉算了。何必抓错,我不看也能知道错误是什么”

0
中山野鬼
中山野鬼
什么叫做“ fclose(fp)为什么不能输出??? ”
0
l
luxu

引用来自“中山野鬼”的答案

什么叫做“ fclose(fp)为什么不能输出??? ”
我试过输入几个数,结束后我打开那个文件没有我输入的内容,把它去掉后就可以了,不明白为什么??
0
l
luxu

引用来自“中山野鬼”的答案

什么叫做“ fclose(fp)为什么不能输出??? ”
你只需看最下面,,其他没关系。output_student_file()函数
0
麦麸子lee
麦麸子lee
if((fp=fopen("学生学籍管理.txt","w"))==NULL),看看是不是你判断的逻辑上?
0
l
luxu

引用来自“南宫傲”的答案

if((fp=fopen("学生学籍管理.txt","w"))==NULL),看看是不是你判断的逻辑上?
我这是照书上抄的。。
0
麦麸子lee
麦麸子lee

引用来自“luxu”的答案

引用来自“南宫傲”的答案

if((fp=fopen("学生学籍管理.txt","w"))==NULL),看看是不是你判断的逻辑上?
我这是照书上抄的。。
唉,你这排版,看错了
0
0
l
luxu

引用来自“yangjingwei”的答案

这排版...
0
l
luxu

引用来自“中山野鬼”的答案

引用来自“luxu”的答案

引用来自“中山野鬼”的答案

什么叫做“ fclose(fp)为什么不能输出??? ”
我试过输入几个数,结束后我打开那个文件没有我输入的内容,把它去掉后就可以了,不明白为什么??

就是嘛,你说清楚点。我猜都能猜出什么问题。你肯定是重复掉用了这个函数。而第二次调用由于链表空,所以没有输出。你不信,可以常识把fopen改成追加。那么东西就可以进去。

当然核心问题是要解决为什么第二次会调用的问题。如果逻辑不可回避,你需要在这个函数里增加进入位置的状态判断。以判断没意义的调用不进行文件操作。这是架构设计的错误导致。

如果我说错了。我立贴道歉。哈。以示我下面话的收回“那么烂的代码,扔掉算了。何必抓错,我不看也能知道错误是什么”

大神啊,受教了,确实是调用了两次。以后多多关照啊。
返回顶部
顶部