文件读写: 二进制方式和文本方式的区别 您所在的位置:网站首页 js读取文件和写入文件的区别 文件读写: 二进制方式和文本方式的区别

文件读写: 二进制方式和文本方式的区别

2024-07-11 02:34| 来源: 网络整理| 查看: 265

 首先要明白一点,就是无论你用哪种语言进行程序设计,也无论你用哪个函数进行文件操作(库函数也好,直接操作系统API也好),最终的文件打开的操作都是由操作系统来进行的,因此各种语言的情况从本质上来说都是相同的。

  用二进制模式打开一个文件的时候,文件本身的内容和你编写程序时用函数读到的内容完全相同(或者说和磁盘上的内容完全相同)。

  但是如果用了文本模式,那么操作系统在将文件内容传给上层程序(库函数,或者是你的程序)时,或者上层程序通过操作系统向文件写入内容时,操作系统都会预先进行一层预处理(或者说转义),具体过程依赖于操作系统的实现。在Windows+VC下,最常见就是将回车符"\r\n"(没有引号,且\作转义符用,下同)解释成"\n"(读出时),将"\n"解释成"\r\n"(写入时)。而在Linux下没有这层转换,这也是Windows和Linux文本文件不通用的原因。

  除此以外,两种打开方式其实是大同小异的。   举个例子,设有一文件file.dat内容为"ABC\r\nABC",那么在下面的代码中,读到的内容将是"ABC\r\nABC":   fp = fopen("file.dat","rb");    while(fgetc(fp)!=EOF);   而在下面的代码中,读到的内容却是"ABC\nABC":   fp = fopen("file.dat","rt");    while(fgetc(fp)!=EOF);

  还有一点要注意的是关于文件定位的问题。在文本模式下最好少用fseek,因为有了库函数的那层转义的存在,fseek会有一些近乎于奇怪的行为。我在Windows+VC下试验发现,尽管在文本模式下"\r\n"还是被当作两个字符计算的,但是当你把文件指针定位到"\r\n"处时,读到的两个字节都是"\n"。

 

        C的文本方读写与二进制读写的差别仅仅体现在回车换行符的处理上.文本方式写时,每遇到一个''\n''(0AH换行符),它将其换成''\r\n''(0D0AH,回车换行),然后再写入文件;当文本读取时,它每遇到一个''\r\n''将其反变化为''\n'',然后送到读缓冲区.正因为文本方式有''\n''--''\r\n''之间的转换,其存在转换耗时.二进制读写时,其不存在任何转换,直接将写缓冲区中数据写入文件.

 

 

二进制读写是将内存里面的数据直接读写入文本中,而文本呢,则是将数据先转换成了字符串,再写入到文本中。下面我用个例子来说明。 我们定义了一个结构体,表示一个学生信息,我们打算把学生的信息分别用二进制和文本的方式写入到文件中。 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进制文件的可移植性好。



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有