唐柏tang 发表于 2014-12-29 23:00:28

文件保存出现乱码

/*
** Copyright (C) QPSOFT.COM All rights reserved.帮帮了!!!改为不是乱码,可以正常显示//代码如下
*/

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MENU_NUM 8
#define N 3
/****************************结构体********************************/
typedef struct s1
{
char       xue ;                   //学号由10个字符组成
char       name ;               //学生姓名
float      score ;               //各门课成绩
float      sum ;                      //总分
float      average ;                  //平均分
char       jian;                  //简介
char       sex;                     //性别
struct s1*next ;                  //指向后继结点的指针
}STUDENT;                                 //定义结构体类型
/********************************全局变量*************************/
struct s1 * head=NULL;                      //链表头结点
//函数声明//
void InputData(STUDENT * ptr );         //录入信息
void PrintMenu( );                        //显示菜单
int MenuSelect( );                        //选择菜单项
void Init( );                           //初始化
void create( );                           //创建链表
void print( ) ;                           //打印链表数据
void Delete( );                           //删除指定学号的记录数据
void Dele_name( );
void append();                            //追加一个数据到链表尾部
void computer();                        //计算链表中所有人的总分和平均分
void savefile();                        //文件保存
void version();                           //版主
void jjfile();
/***********************************主函数********************************/
void main()
{
int key;
while(1) {
key=MenuSelect();
switch(key)
{
case 0:
version(); //版本作者
case 1:
Init();            //将head置为空NULL
break;
case 2:
create();            //创建链表,输入数据
break;
case 3:
Delete();         //删除一个指定学号的记录数据
break;
case 4:
print();          //打印链表中所有数据
break;
case 5:
Dele_name( );             //姓名查找删除
break;
case 6:
append();                //增加一个学生记录
break;
case 7:
computer();             //计算链表中所有人的总分和平均分
break;
case 8:
savefile( );             //保存文件
break;
case 9:
Init();         //释放链表
exit(0);
}
}
}

//菜单函数
void PrintMenu( )
{
int i;
char * menu[]={
"***********************************************",
"*|            学生成绩管理系统               |*",
"*|   1. 初始化链表      2. 创建链表      |*",
"*|   3. 学号删除          4. 打印成绩信息    |*",
"*|   5. 姓名删除          6. 插入一条学生记录|*",
"*|   7. 总分和平均分      8. 保存文件      |*",
"*|   9. 退出            0. 系统版本      |*",
"***********************************************",
};
printf("\n\n");
for (i=0;i<MENU_NUM;i++)
printf("%s\n",menu);
printf("\n输入要进行的操作(0-9):");
}

//选择菜单选项,返回选择的选项
int MenuSelect( )
{
int key;
PrintMenu( );
scanf("%d",&key);
return key;
}

//初始化单链表
void Init( )
{
STUDENT *p,*ptr;                        //针变量p,ptr
p=head;
ptr=head;                               //指向头指针head ;
while(ptr!=NULL)
{
ptr=ptr->next;                      //ptr指向下一个结构数据
free(p);                            //释放p
p=ptr;                              //将p指向ptr所指向的数据
}
head=NULL;                        //将head指向NULL
}

//创建单链表
void create( )
{
STUDENT *pt, *pth=NULL;                        //pt指向即将申请新的数据内存,pth指向当前数据
while(1)
{
pt=(STUDENT *)malloc(sizeof(STUDENT));   //让pt指向新申请的内存空间
InputData(pt);                           //输入数据,存放到pt所指向的结构数据。让pt的next指向NULL
if (strcmp(pt->xue,"#")==0)            //   #结束输入学号
{
free(pt);                              //释放pt
break;                                 //退出循环
}
else if (head==NULL)
{
pth=pt;
head=pt;                               //将头指针head和pth指向pt
}
else
{
pth->next=pt;                        //将pth的next指向pt;
pth=pt;                              //将pth指向pt;
}
}
}

//打印单链表中所有数据
void print( )
{
int i=0;
STUDENT *p;                                    //第一个指针p
p=head;                                        //将p指向head
printf("\n");
printf("******************************STUDENT*******************************************\n");
printf("|rec|    学号|姓名   | 性别 | 英语1| 数学2| 数据3|总成绩|平均成绩| 简介信息|\n");
printf("|---|----------|---------|------|------|------|------|------|--------|---------|\n");

//打印表头
while (p!=NULL)
{
printf("|%3d|%10s|%9s|%6s|%6.1f|%6.1f|%6.1f|%6.2f|%8.2f|%9s|\n",
++i,p->xue,p->name,p->sex,p->score,p->score,p->score,
p->sum,p->average,p->jian);   //打印p所指向的结构中的所有数据
p=p->next;                  //将p指向p的下一个结构数据
}
printf("********************************END*********************************************\n");
                                             //打印表尾
}
//删除指定学号的记录
void Delete( )
{
STUDENT *p,*pth;                              //定义两个指针p,pth
char no;                                  //定义一个整数no(用来存储输入的学号)
printf("输入要删除学生的学号:");
scanf("%s",no);                               //用输入语句输入一个学号存储到no中
p=head;pth=head;                              //将p和pth都指向头指针
if (strcmp(p->xue,no)==0)                      //也就是若头指针指向的数据需要删除
{
head=head->next;                        //将head指针指向head的下一个数据;
free(p);                                  //释放p所指向的数据
}
else
{
p=p->next;                              //将p指向p的下一个数据
while ( p!=NULL)
{
if (strcmp(p->xue,no)==0)            //找到了要删除的数据
{
pth->next=p->next;                //将pth的next指向p的next
free(p);                        //释放p
break;                            //退出循环
}
else
{
pth=pth->next;                  //将pth指向pth的next或 将pth指向p
p=p->next;                        //将p指向p的next
}
}
}
}


//姓名查找删除·
void Dele_name( )
{
STUDENT *p,*pth;                              //定义两个指针p,pth
char str_name;                                  //定义一个整数no(用来存储输入的学号)
printf("输入要删除学生的姓名:");
scanf("%s",str_name);                               //用输入语句输入一个学号存储到no中
p=head;pth=head;                              //将p和pth都指向头指针
if(strcmp(p->name,str_name)==0)                     //也就是若头指针指向的数据需要删除
{
head=head->next;                        //将head指针指向head的下一个数据;
free(p);                                  //释放p所指向的数据
}
else
{
p=p->next;                              //将p指向p的下一个数据
while ( p!=NULL)
{
if (strcmp(p->name,str_name)==0)            //找到了要删除的数据
{
pth->next=p->next;                //将pth的next指向p的next
free(p);                        //释放p
break;                            //退出循环
}
else
{
pth=pth->next;                  //将pth指向pth的next或 将pth指向p
p=p->next;                        //将p指向p的next
}
}
}
}

//增加学生记录
void append()
{
STUDENT *p,*pth;                           //定义两个指针变量p,pth
pth=head;                                    //将pth指向head
while ( pth->next!=NULL)
{
pth=pth->next;                           //ptr指向ptr的next
}
p=(STUDENT *)malloc(sizeof(STUDENT));      //将p指向新申请的内存空间
InputData(p);
p->next=NULL;                              //数据数据存储到p所指向的内存空间,注意将p的next置为NULL
pth->next=p;                                 //将ptr的next指向p
}

//输入学生信息
void InputData(STUDENT *ptr )
{
int i;
printf("输入学号:");
scanf("%s",ptr->xue);
if (strcmp(ptr->xue,"#")==0 )
return;
printf("输入姓名:");
scanf("%s",ptr->name);
printf("输入性别:");
scanf("%s",ptr->sex);

printf("输入简介:");
scanf("%s",ptr->jian);
for(i=0;i<3;i++)
{
printf("输入成绩:");
scanf("%f",&ptr->score);
}
ptr->sum=0;
ptr->average=0;
ptr->next=NULL;   //不要忘记这一步
}

//计算学生总成绩和平均成绩
void computer()
{
{
STUDENT *p;
p=head;
for(;p;p=p->next)
{
p->sum=p->score+p->score+p->score;
p->average=(p->score+p->score+p->score)/3;
p->jian;
p->sex;
}
printf("------>按‘4’查看<--------");//提示信息
}
}
//文件保存//
void savefile()
{
    STUDENT *p=NULL;
    STUDENT *p1=head;
    FILE *fp;
    char ch, filename;
    int count=0;
      printf("Please input the filename you want to write: ");
      scanf("%s", filename);
      fp = fopen(filename, "wt+");
      if(fp==NULL)
      {
            printf("Cannot open the file!n");
            exit(0);   // 终止程序
      }
    p=p1->next;//调用头指针
      while(p)
      {
          if(fwrite(p,sizeof(STUDENT),1,fp)==1)
          {
            p=p->next;
            count++;
          }
   else
   {
      break;
   }
   }
   if(count>0)
    {
      printf("count= %d\n",count);
      getch();
    }
fclose(fp);
}

//版本信息//
void version()
{
printf("最新版本 ###:###:@@@\n");
printf("版主:\n");
}


帮帮了!!!改为不是乱码,可以正常显示



折心灬小轩 发表于 2014-12-29 23:00:29

本帖最后由 折心灬小轩 于 2015-1-1 15:54 编辑

楼上的写法没有错,是把所有的字符放到了一个字符串中,下面的写法是你的想法:
//菜单函数
void PrintMenu( )
{
int i;
char * menu[]={
"***********************************************",
"*|            学生成绩管理系统               |*",
"*|   1. 初始化链表      2. 创建链表      |*",
"*|   3. 学号删除          4. 打印成绩信息    |*",
"*|   5. 姓名删除          6. 插入一条学生记录|*",
"*|   7. 总分和平均分      8. 保存文件      |*",
"*|   9. 退出            0. 系统版本      |*",
"***********************************************",
};
printf("\n\n");
for (i=0;i<MENU_NUM;i++)
printf("%s\n",menu);                        //是menu<i>而不是menu
printf("\n输入要进行的操作(0-9):");
}

用字符串数组的时候请注意,不要丢失遍历下标

Vikki 发表于 2014-12-31 00:03:14

不能为了结婚而去喜欢一个人

swsm 发表于 2014-12-31 09:25:47


//菜单函数
void PrintMenu( )
{
    int i, j;
    charmenu[]={"\n\
            ***********************************************\n\
            *|            学生成绩管理系统               |*\n\
            *|   1. 初始化链表      2. 创建链表      |*\n\
            *|   3. 学号删除          4. 打印成绩信息    |*\n\
            *|   5. 姓名删除          6. 插入一条学生记录|*\n\
            *|   7. 总分和平均分      8. 保存文件      |*\n\
            *|   9. 退出            0. 系统版本      |*\n\
            ***********************************************\n"   
    };
   
    printf("\n\n");
    printf("%s\n", menu);
    printf("\n输入要进行的操作(0-9):");
}


//你的乱码问题好像就在这个函数里,剩下的逻辑和一些代码问题你再自己看看!
//呵呵, 有问题, 再交流!!!

马沸腾 发表于 2015-2-10 20:03:04

用WORD试试

ANDES 发表于 2015-2-10 20:20:17

Vikki 发表于 2014-12-31 00:03
不能为了结婚而去喜欢一个人

不以结婚为目的的谈恋爱都是耍流氓。

mhhnjuol 发表于 2015-2-12 19:40:09

我主要来看看答案是什么

神释 发表于 2015-2-12 21:12:07

我是来看大神分析的

freeparty 发表于 2015-2-12 21:36:25

实在不行你就用宽字符试一试,unicode

freeparty 发表于 2015-2-12 21:37:08

有可能是源代码文件的编码格式有误。
页: [1]
查看完整版本: 文件保存出现乱码