| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 3116 人关注过本帖
标题:通过结构体保存的文件,输出到显示器是正确的,但是直接查看文件是乱码,为 ...
只看楼主 加入收藏
waterstar
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:小飞侠
威 望:5
帖 子:984
专家分:2810
注 册:2010-2-12
收藏
得分:0 
当我们读取文件的时候,读入的是数据流,这些数据流本身没有什么意义,比如0x41,0x42,0x43这样的数据,我们处理这些数据的时候就遵循特定的方法去处理,比如你要输出0x41这个数据的时候,你用%c输出,它就是一个字符a,你用%d输出,它就是数字65.

fwrite函数是把一串数据流输入到文件中去,比如你想把数据123456789(十进制)输入到文件中去,其对应的十六进制是0x75BCD15。当文件被打开的时候,你所看到的都是文本,都是字符,所以文件中的任何东西都会被一个字节一个字节地转换为字符输出,如果读取到的数据不是有效的字符,它就会显示成乱七八道的东西,就像你的程序中输出的东西一样。这种情况就要用别的函数把你要输入的非文本转换成文本输入进去,这些函数有fprintf(),fputs(),和fputc(),自然,读取的时候有相对应的读取函数fscanf(),fgets(),和fgetc(),熟练用这些就能正确的读取和输入文本中了

希望对你有帮助。

冰冻三尺,非一日之寒;士别三日,不足刮目相看!
2011-11-20 20:50
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
其实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。现在你明白数据在内存、读和写三者之间的区别了吗?其实,这些东西是计算机原理中必须要懂的知识,是每一个学编程的人都需要懂的铺垫知识,不是一下子就抱着编程教程啃代码编写、语法的,没有这些东西,连程序如何写都不晓得。

授人以渔,不授人以鱼。
2011-11-20 22:05
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
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
把你输出到屏幕上的函数printf()改成fprintf()即可(类似在前面加f)。这样输出到文件就是普通的text文本文件,只是很难读回来(需要自己置定格式),而且无论读写速度都会稍慢。如何衡量,你自己决定吧,代码是不给你改的。

[ 本帖最后由 TonyDeng 于 2011-11-20 22:40 编辑 ]

授人以渔,不授人以鱼。
2011-11-20 22:34
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
embed_xuel
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:58
帖 子:3845
专家分:11385
注 册:2011-9-13
收藏
得分:0 
什么呀,你只是想别人给你改代码,跟本不去想为什么

[ 本帖最后由 embed_xuel 于 2011-11-21 11:30 编辑 ]

总有那身价贱的人给作业贴回复完整的代码
2011-11-20 23:43
markz
Rank: 2
等 级:论坛游民
帖 子:11
专家分:20
注 册:2011-10-1
收藏
得分:0 
学习下
2011-11-21 10:27
hellovfp
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:禁止访问
威 望:30
帖 子:2976
专家分:7697
注 册:2009-7-21
收藏
得分:0 
学习得头晕。

我们都在路上。。。。。
2011-11-21 10:32
waterstar
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:小飞侠
威 望:5
帖 子:984
专家分:2810
注 册:2010-2-12
收藏
得分:0 
唉,这种帖子就是不想回,只想代码不想原理的贴。

冰冻三尺,非一日之寒;士别三日,不足刮目相看!
2011-11-21 12:37
快速回复:通过结构体保存的文件,输出到显示器是正确的,但是直接查看文件是乱码 ...
数据加载中...
 
   



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

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