| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 3116 人关注过本帖
标题:通过结构体保存的文件,输出到显示器是正确的,但是直接查看文件是乱码,为 ...
取消只看楼主 加入收藏
xdh0817
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:193
专家分:195
注 册:2011-10-20
结帖率:92.86%
收藏
已结贴  问题点数:20 回复次数:9 
通过结构体保存的文件,输出到显示器是正确的,但是直接查看文件是乱码,为什么?要怎么改?
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
struct student
{
    char name[10];
    long num;
    char sex[10];
    int age;
    char adrr[10];
    int pay;
    char health[10];
    char classa[10];
}a[5];
struct jian
{
 char name[10];
 int pay;
}b[5];
void main()
{
 FILE *fp1,*fp2,*fp3;
 int i;
 fp1=fopen("x1.txt","wb");
 for(i=0;i<=4;i++)
 scanf("%s%ld%s%d%s%d%s%s",&a[i].name,&a[i].num,&a[i].sex,&a[i].age,&a[i].adrr,&a[i].pay,&a[i].health,&a[i].classa);
 for(i=0;i<5;i++)
  fwrite(&a[i],sizeof(struct student),1,fp1);
fclose(fp1);
//以上是把数据写入x1.txt
fp2=fopen("x1.txt","rb");
 for(i=0;i<=4;i++)
 {
     fread(&a[i],sizeof(struct student),1,fp2);
     strcpy(b[i].name,a[i].name);
     b[i].pay=a[i].pay;
 }
 fclose(fp2);
 //以上是从x1.txt读数据,赋给b[5]
 fp3=fopen("x22.txt","wb");
 for(i=0;i<=4;i++)
 {
 fwrite(&b[i],sizeof(struct jian),1,fp3);
 printf("%-10s%-5d\n",b[i].name,b[i].pay);
 }
 fclose(fp3);
 //把b[5]写入x22.txt
}
搜索更多相关主题的帖子: 显示器 include health 结构体 
2011-11-19 20:29
xdh0817
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:193
专家分:195
注 册:2011-10-20
收藏
得分:0 
难道要把定义的空间沾满才能不是乱码?
2011-11-19 21:12
xdh0817
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:193
专家分:195
注 册:2011-10-20
收藏
得分:0 
以下是引用TonyDeng在2011-11-19 21:15:15的发言:

在内存和文件中储存的都是二进制数据,不是供人眼看的“文本”。
#include<stdio.h>
#include<stdlib.h>
void main()
{ FILE *fp;
 char ch,name[10];
 gets(name);
  fp=fopen(name,"w");
  ch=getchar();
while(ch!='\n')
  {
  fputc(ch,fp);
  ch=getchar();   
      
  }
  fclose(fp);
}

为什么这个可以呢
2011-11-20 13:19
xdh0817
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:193
专家分:195
注 册:2011-10-20
收藏
得分:0 
以下是引用TonyDeng在2011-11-20 13:23:32的发言:

完全无视基础原理而急于写程序,这就是一个典型例子。很多初学者(包括若干已学者)都有这种毛病,这些人,你跟他讲原理时嫌你啰嗦,只要代码,但屡错屡犯,永远没长进。
那你解释一下吧
2011-11-20 19:12
xdh0817
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:193
专家分:195
注 册:2011-10-20
收藏
得分:0 
以下是引用TonyDeng在2011-11-20 13:23:32的发言:

完全无视基础原理而急于写程序,这就是一个典型例子。很多初学者(包括若干已学者)都有这种毛病,这些人,你跟他讲原理时嫌你啰嗦,只要代码,但屡错屡犯,永远没长进。
解释一下吧,不嫌你啰嗦~
2011-11-20 19:13
xdh0817
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:193
专家分:195
注 册:2011-10-20
收藏
得分:0 
回复 9楼 waterstar
请教了
2011-11-20 20:48
xdh0817
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:193
专家分:195
注 册:2011-10-20
收藏
得分:0 
以下是引用TonyDeng在2011-11-20 22:05:05的发言:

其实5楼已经回了楼主的问题,而且这个问题我也在坛上好几个帖子中解释过,实在不想老重复的。楼主只要想一下如下代码:
 
int i = 65;
printf("%d,%c", i, i);

这段代码对同一个数据i,为什么会看到不同的结果?答案的关键点是留意printf()的格式串"%d"和"%c",那是你要求程序输出不同的结果。同样,结构体中的数值型数据,就是这里的i,fwrite()出去的时候,它们是以内部数据的格式写在文件中的,比如i=65,那么就是4byte的整数0x00000041,而不是1byte的字符'A';这也是你必须用fread()读回来的原因,因为你根本不知道文件中这4byte到底是一个整数值还是4byte的字符值。是整数还是字符,犹如你是用scanf("%d", &x)还是用scanf("%s", x)的区别一样。注意:在键盘上你敲的65,绝对是两个字符'6''5',而不是整数65,scanf()函数只会根据你的"%d"还是"%s"指令来解释,如果是后者,它是把字符串"65"运算转化为整数赋给变量x。现在你明白数据在内存、读和写三者之间的区别了吗?其实,这些东西是计算机原理中必须要懂的知识,是每一个学编程的人都需要懂的铺垫知识,不是一下子就抱着编程教程啃代码编写、语法的,没有这些东西,连程序如何写都不晓得。
恩,其实我想问的问题是:你把我的程序改改,让我打开txt时能看懂
2011-11-20 22:28
xdh0817
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:193
专家分:195
注 册:2011-10-20
收藏
得分:0 
以下是引用TonyDeng在2011-11-20 22:34:56的发言:

把你输出到屏幕上的函数printf()改成fprintf()即可(类似在前面加f)。这样输出到文件就是普通的text文本文件,只是很难读回来(需要自己置定格式),而且无论读写速度都会稍慢。如何衡量,你自己决定吧,代码是不给你改的。



我用fprint函数干嘛?我只想通过双击打开txt能看
2011-11-20 23:15
xdh0817
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:193
专家分:195
注 册:2011-10-20
收藏
得分:0 
以下是引用TonyDeng在2011-11-20 22:34:56的发言:

把你输出到屏幕上的函数printf()改成fprintf()即可(类似在前面加f)。这样输出到文件就是普通的text文本文件,只是很难读回来(需要自己置定格式),而且无论读写速度都会稍慢。如何衡量,你自己决定吧,代码是不给你改的。


其实最近比较累,不想上机操作,只想找个人直接告诉我程序,
2011-11-20 23:16
xdh0817
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:193
专家分:195
注 册:2011-10-20
收藏
得分:0 
以下是引用embed_xuel在2011-11-20 23:43:19的发言:

什么呀,你只是想别人给你改代码,跟本不去想为什么

只有这一次不想去思考,哈哈
2011-11-21 12:58
快速回复:通过结构体保存的文件,输出到显示器是正确的,但是直接查看文件是乱码 ...
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.036058 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved