鱼C论坛

 找回密码
 立即注册
查看: 2295|回复: 9

文件保存出现乱码

[复制链接]
发表于 2014-12-29 23:00:28 | 显示全部楼层 |阅读模式
20鱼币
/*
** 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] ;                   //学号由10个字符组成
char       name[15] ;                 //学生姓名
float      score[N] ;                 //各门课成绩
float      sum ;                      //总分
float      average ;                  //平均分
char       jian[255];                    //简介
char       sex[10];                     //性别
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[i]);
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[0],p->score[1],p->score[2],
p->sum,p->average,p->jian);   //打印p所指向的结构中的所有数据
p=p->next;                    //将p指向p的下一个结构数据
}
printf("********************************END*********************************************\n");
                                               //打印表尾
}
//删除指定学号的记录
void Delete( )
{
STUDENT *p,*pth;                              //定义两个指针p,pth
char no[11];                                  //定义一个整数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[20];                                  //定义一个整数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[i]);
}
ptr->sum=0;
ptr->average=0;
ptr->next=NULL;   //不要忘记这一步
}

//计算学生总成绩和平均成绩
void computer()
{
{
STUDENT *p;
p=head;
for(;p;p=p->next)
{
p->sum=p->score[0]+p->score[1]+p->score[2];
p->average=(p->score[0]+p->score[1]+p->score[2])/3;
p->jian;
p->sex;
}
printf("------>按‘4’查看<--------");//提示信息
}
}
//文件保存//
void savefile()
{
    STUDENT *p=NULL;
    STUDENT *p1=head;
    FILE *fp;
    char ch, filename[20];
    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");
}


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



最佳答案

查看完整内容

楼上的写法没有错,是把所有的字符放到了一个字符串中,下面的写法是你的想法: 用字符串数组的时候请注意,不要丢失遍历下标
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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[i]);                        //是menu<i>而不是menu
printf("\n输入要进行的操作(0-9):");
}
[i]
用字符串数组的时候请注意,不要丢失遍历下标
[/i]
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-12-31 00:03:14 | 显示全部楼层
不能为了结婚而去喜欢一个人
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-12-31 09:25:47 | 显示全部楼层
//菜单函数
void PrintMenu( )
{
    int i, j;
    char  menu[]={"\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):");
}
//你的乱码问题好像就在这个函数里,剩下的逻辑和一些代码问题你再自己看看!
//呵呵, 有问题, 再交流!!!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-2-10 20:03:04 | 显示全部楼层
用WORD试试
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-2-10 20:20:17 | 显示全部楼层
Vikki 发表于 2014-12-31 00:03
不能为了结婚而去喜欢一个人

不以结婚为目的的谈恋爱都是耍流氓。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-2-12 19:40:09 | 显示全部楼层
我主要来看看答案是什么
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-2-12 21:12:07 | 显示全部楼层
我是来看大神分析的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-2-12 21:36:25 | 显示全部楼层
实在不行你就用宽字符试一试,unicode
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-2-12 21:37:08 | 显示全部楼层
有可能是源代码文件的编码格式有误。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-25 18:26

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表