浅谈二进制文件读写和文本文件读写的区别

      昨天在看一篇文章的时候,突然想起了这个基础性的问题,自己一直对它的区别不是很清楚,于是今天上午研究下了,分享下自己的理解。(对它很清楚的同学们可以略过此篇文章)
      从存储方式来说,文件在磁盘上的存储方式都是二进制形式,所以,文本文件其实也应该算二进制文件。那么他们的区别呢,各自的优缺点呢?不急,我慢慢道来。
      先从他们的区别来说,虽然都是二进制文件,但是二进制代表的意思不一样。打个比方,一个人,我们可以叫他的大名,可以叫他的小名,但其实都是代表这个人。二进制读写是将内存里面的数据直接读写入文本中,而文本呢,则是将数据先转换成了字符串,再写入到文本中。下面我用个例子来说明。
我们定义了一个结构体,表示一个学生信息,我们打算把学生的信息分别用二进制和文本的方式写入到文件中。
struct  Student 
{
    
int  num;
    
char  name[ 20 ];
    
float  score;
};
我们定义两个方法,分别表示内存写入和文本写入
// 使用二进制写入
void  write_to_binary_file()
{
    
struct  Student stdu;
    stdu.num 
=   111 ;
    sprintf_s(stdu.name,
20 , " %s " , " shine " );
    stdu.score 
=   80.0f ;
    fstream binary_file(
" test1.dat " ,ios:: out | ios::binary | ios::app);  // 此处省略文件是否打开失败的判断
    binary_file.write(( char   * ) & stdu, sizeof ( struct  Student)); // 二进制写入的方式
    binary_file.close();

// 文本格式写入
void  write_to_text_file()
{
    
struct  Student stdu;
    stdu.num 
=   111 ;
    sprintf_s(stdu.name,
20 , " %s " , " shine " );
    stdu.score 
=   80.0f ;
    FILE 
* fp  =  fopen( " test2.dat " , " a+ " );    // 此处省略文件是否打开失败的判断
    fprintf(fp, " %d%s%f " ,stdu.num,stdu.name,stdu.score);  // 将数据转换成字符串(字符串的格式可以自己定义)
    fclose(fp);

// MAIN函数调用前面两个方法
int  _tmain( int  argc, _TCHAR *  argv[])
{
    write_to_binary_file();
    write_to_text_file();
    
    
return   0 ;
}
我们来看下,文件里面的格式 2进制文件

文本文件


2进制文件里面将111编码成6F,1个字节,这刚好是111的16进制表示,而文本文件中则写成31,31,31用了3个字节,表示111。73   68   69   6E   65 表示shine,之后2进制文件里是几个连续的FE,而文本文件中是38   30......文本文件将浮点数80.000000用了38(表示8)   30(表示0)  2E(表示.)   30(表示0)   30(表示0)   30(表示0)   30(表示0)   30(表示0)   30(表示0),二进制文件用了4个字节表示浮点数00   00   A0   42
通过这里我们可以初见端倪了,二进制将数据在内存中的样子原封不动的搬到文件中,文本格式则是将每一个数据转换成字符写入到文件中,他们在大小上,布局上都有着区别。由此可以看出,2进制文件可以从读出来直接用,但是文本文件还多一个“翻译”的过程,因此2进制文件的可移植性好。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值