C语言文本文件与二进制文件问题

#include <stdio.h>
void main()
{
int a,b;
FILE *fp;
fp=fopen("C:\\tab.txt","w+");
scanf("%d",&a);
fwrite(&a,sizeof(int),1,fp);
rewind(fp);
fread(&b,sizeof(int),1,fp);
printf("%d",b);
}

输入:26
输出结果为一个不确定的数,但把"w+"改为"wb+"就正确了.
谁知道原因?

这些都是C语言打开文件函数fopen的一个参数打开文件方式的值:
定义函数 FILE * fopen(const char * path,const char * mode);
函数说明 参数path字符串包含欲打开的文件路径及文件名,参数mode字符串则代表着流形态。
mode有下列几种形态字符串:
r 打开只读文件,该文件必须存在。
r+ 打开可读写的文件,该文件必须存在。
rb+ 读写打开一个二进制文件,只允许读写数据。
rt+ 读写打开一个文本文件,允许读和写。
w 打开只写文件,若文件存在则文件长度清为0,即该文件内容会消失。若文件不存在则建立该文件。
w+ 打开可读写文件,若文件存在则文件长度清为零,即该文件内容会消失。若文件不存在则建立该文件。
a 以附加的方式打开只写文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾,即文件原先的内容会被保留。
a+ 以附加方式打开可读写的文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾后,即文件原先的内容会被保留。
wb 只写打开或新建一个二进制文件;只允许写数据。
wb+ 读写打开或建立一个二进制文件,允许读和写。
wt+ 读写打开或着建立一个文本文件;允许读写。
at+ 读写打开一个文本文件,允许读或在文本末追加数据。
ab+ 读写打开一个二进制文件,允许读或在文件末追加数据。
上述的形态字符串都可以再加一个b字符,如rb、w+b或ab+等组合,加入b 字符用来告诉函数库打开的文件为二进制文件,而非纯文字文件。不过在POSIX系统,包含Linux都会忽略该字符。由fopen()所建立的新文件会具有S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH(0666)权限,此文件权限也会参考umask 值。

自己看吧
温馨提示:答案为网友推荐,仅供参考
第1个回答  2010-05-01
你试试输入别的字符,输入啥就得到啥
但是26代表控制字符ctrl Z,当你以w+ 也就是文本方式读写时,会将26看成文件结尾,结果一打开就到了文件尾,你得到了一个随机值,b没有被赋值。你可以试着在b的定义出将其初始化,只要运行程序你输入26,输出的值是b初始化时候的值,但除了26,其他的都输入啥就输出啥。
wb+是二进制方式,将照原样读取。本回答被提问者采纳
第2个回答  2020-02-28
因为int存储的是源数据,而ch[5]存储的是ascii码。
你用记事本打开,前者,显示的当然是乱码,如果你用16进制编辑器打开
你就可以看到
7F
80
01
00,即为:
0x1807F,(低字节在前)
,也就是98431的16进制表示形式。
用记事本打开后者,则可以看到98431,而用16进制编辑器打开后者,则会显示98431的16进制表示的ASCII码,共5个字节。
两者存储的内容不一样,所以用不同的工具打开,查看的结果看着也不同。
第3个回答  2015-07-16
   C语言中文本文件与二进制文件:
  计算机的存储在物理上是二进制的,所以文本文件与二进制文件的区别并不是物理上的,而是逻辑上的。这两者只是在编码层次上有差异。
  简单来说,文本文件是基于字符编码的文件,常见的编码有ASCII编码,UNICODE编码等等。
  二进制文件是基于值编码的文件,可以根据具体应用,指定某个值是什么意思(这样一个过程,可以看作是自定义编码)。
  因为文本文件与二进制文件的区别仅仅是编码上不同,所以他们的优缺点就是编码的优缺点,这个找本编码的书来看看就比较清楚了。
  文本文件编码基于字符定长,译码容易些;二进制文件编码是变长的,所以它灵活,存储利用率要高些,译码难一些(不同的二进制文件格式,有不同的译码方式)。关于空间利用率,想想看,二进制文件甚至可以用一个比特来代表一个意思(位操作),而文本文件任何一个意思至少是一个字符。
相似回答