C语言中二进制文件和文本文件的区别

所有的信息在内存中都是以二进制的形式进行存储的,这说明了二进制文件和文本文件不是在硬件上进行区分的。

二进制和文本文件因为操作系统的不同而不同,毕竟不同的人实现同一问题的思路也不是完全一样的嘛,首先说一下比较简单的那个:在Linux环境中,二进制文件和文本文件不进行区分。也就是说这两种方式在Linux操作系统下的实现机制是一样的;在OS X下面,太高大上了,用不到,所以也不关心;在Windows下面,二进制和文本文件是有区别的,下面就主要说明一下两者在Windows环境下的区别以及对应的文件操作函数。

首先来说明一下:文件是什么?文件的本质其实也就是一段存储空间,不过这段空间是位于磁盘上的。程序中使用文件的主要目的就是为了在程序结束后程序中的一些数据依旧能够得到保存以便下次使用或者直接查阅。

我主要将Windows环境下二进制文件和文本文件的区别归为以下几方面:

1、在Windows环境下,每一行结束的结束符是回车符和换行符的组合\r\n。C语言中是以\n作为换行符的。如果C程序是通过文本文件来处理的,那么它会很聪明地在这里做一个自动转换。在写入文本的时候,它会将\n转换为\r\n,在从文本读出来的时候,它会对应的将\r\n转换为\n。不得不吐槽一下,这个做法相对Linux来说很不好。

2、对应的处理函数不同

选择使用二进制文件还是使用文本文件需要在fopen()函数中的第二个参数打开模式进行选择。其中多一个字母b的为二进制文件,没有的对应为文本文件。

2.1、文本文件操作函数

1)写入文本文件

int fputc(int c,FILE* pfile);

2)读取文本文件

mchar = fgetc(pfile);

3)将字符串写入文本文件

int fputs(char *pstr, FILE* pfile);//这个函数以‘\0‘为结束符,‘\0‘并不会被写入文件

4)从文本文件读取字符串

char *fgets(char *pstr, int nchars, FILE* pfile);//读到‘\0‘或者长度为nchars-1结束

上面这两组函数主要用来将字符或字符串读/写入文本文件。当需要处理其他的数据类型时往往使用下面两个函数:

格式化输入、输出

5)格式化文件输出

fprintf(pfile,"%...",XXX,XXX,XXX);//用法和printf一样

6)格式化文件输入

fscanf(pfile,"%...",XXX,XXX,XXX);//用法和scanf对stdin的操作一样

格式化输入输出的缺点:精度不够,会造成浮点型变量精度丢失。

以上三组IO操作都是文本文件操作。下面开始介绍二进制文件操作。

二进制文件的优点有以下几点:

1)没有数据转换,所以也就不存在精度丢失

2)二进制文件的读写速度相比较于文本文件要快一点,因为文本文件需要做一些格式的改变。

2.2、二进制文件读写函数:

1)读函数

fread

2)写函数

fwrite

总结:

我只能说,要尽量使用二进制读写函数来操作二进制文件,使用文本文件读写函数来操作文本文件,但这并不是强制的,你混用了编译器也不会报错,但是估计有时候结果并不是你想要得到的结果。

如果写入的是文本文件,那么就请在读取时也使用文本文件,二进制文件也是一样,混用的话会导致一些很奇葩的问题。

二进制文件和文本文件其实就是在文件的控制方面有一点不一样,这对于使用者来说其实都不会是太大的影响,关键是你要正确使用二进制文件和文本文件对应的IO操作函数。不要太过于纠结到底要使用哪个,因为它们两个在系统中都有实现。

注:不足之处希望可以指出,谢谢

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-12-20 07:07:42

C语言中二进制文件和文本文件的区别的相关文章

C语言中二进制文件的读取

fwrite()与fprintf()是不同的. fwrite将写入的数据作为文件的磁盘内容保存.fprintf将写入的数据的每个字符所对应的ASCII码作为文件的磁盘内容保存.fprintf做了一个转换的工作. 当打开文件时,记事本会自动把文件的磁盘内容作为ASCII码转换成对应的字符,然后再显示出来,即显示的是文本内容而不是磁盘内容. 例如,用fwrite向文件写入"65"时,文件的磁盘内容就是保存的65(磁盘上以二进制表示).当用记事本打开文件时,记事本会读到65,并把65看作一个

C语言中堆和栈的区别

原文:http://blog.csdn.net/tigerjibo/article/details/7423728 一.前言: C语言程序经过编译连接后形成编译.连接后形成的二进制映像文件由栈,堆,数据段(由三部分部分组成:只读数据段,已经初始化读写数据段,未初始化数据段即BBS)和代码段组成,如下图所示: 1.栈区(stack):由编译器自动分配释放,存放函数的参数值,局部变量等值.其操作方式类似于数据结构中的栈. 2.堆区(heap):一般由程序员分配释放,若程序员不释放,则可能会引起内存泄

C#语言中数组与集合的区别(以List集合为例)

数组用于保存固定数量的数据,定长,占用内存少,遍历速度快: 集合保存的数据数量,可以在程序的执行过程中,不断发生变化,不定长,占用内存多,遍历速度慢: 在功能上,数组能实现的所有功能,集合都能实现:反之,集合能实现的某些功能,数组难以实现. 下面以List集合为例,具体说明集合与数组的区别: 1.定义的格式 集合:List <数据类型> 变量名; 数组:数据类型 [ ] 变量名; 2.赋值 集合:变量名 = new List <数据类型> ( );  集合是不定长的,所以赋值时无须

C语言中线程和进程的区别

线程是指进程内的一个执行单元也是进程内的可调度的实体,与进程的区别 1) 调度:线程作为调度和分配的基本单位,进程作为拥有资源的基本单位 2) 并发性:不仅进程之间可以并发执行,同一个进程之间的多个线程可以并发执行 3) 拥有资源:进程是拥有资源的一个独立单位,线程不拥有系统资源,但是可以访问隶属于进程的资源 4)系统开销: 在创建或撤销进程时,由于系统都要之分配和回收资源,导致系统的开销明显大于创建或撤销线程时的开销

C语言中的声明与定义的区别

1.对于下面的声明语句 int a; 如果其位置出现在所有的函数体之外,那么它就被称为外部对象a的定义.这个语句说明了a是一个外部整型变量,同时为a分配了存储空间.因为外部对象a并没有被明确指定任何初始值,所以它的初始值默认为0(某些系统中的连接器对以其他语言编写的程序并不保证这一点,C编译器有责任以适当方式通知连接器,确保未指定初始值的外部变量初始化为0). 2.又如下面的声明语句: int a = 7; 在定义a的同时也为a明确指定了初始值.这个语句不仅为a分配内存,而且也说明了在该内存中应

Django与SQL语言中——NULL与空字符串的区别

SQL有指定空值的独特方式,它把空值叫做NULL. Null在数据库中表示 不知道的数据,主要有3种意思: 1)知道数据存在,但不知道具体值. 2)不知道数据是否存在. 3)数据不存在. 在SQL中, NULL的值不同于空字符串,就像Python中None不同于空字符串("")一样.这意味着某个字符型字段(如VARCHAR)的值不可能同时包含NULL和空字符串. 这会引起不必要的歧义或疑惑. 为什么这条记录有个NULL,而那条记录却有个空字符串? 它们之间有区别,还是数据输入不一致?

C语言中值得深入知识点----数组做函数参数、数组名a与&amp;a区别、数组名a的&quot;数据类型&quot;

1.数组作为函数参数 C语言中,数组做为函数的参数,退化为指针.数组作为参数传给函数时,传的是指针而不是数组,传递的是数组的首元素的地址.这里我们以将以整形变量排序来讲解. void sortArray(int a[] ,int num )以及void sortArray(int a[100] ,int num )都可以用void sortArray(int *a ,int num )表示.一般来说函数参数如果为数组,可以有两个参数,一个是数组名,一个是数组长度.对于排序而已,一般是要知道给定数

Jvm(29),理解升级----C语言中的堆和栈的区别 (可以借鉴)

在计算机领域,堆栈是一个不容忽视的概念,我们编写的C语言程序基本上都要用到.但对于很多的初学着来说,堆栈是一个很模糊的概念. 堆栈:一种数据结构.一个在程序运行时用于存放的地方,这可能是很多初学者的认识,因为我曾经就是这么想的和汇编语言中的堆栈一词混为一谈.我身边的一些编程的朋友以及在网上看帖遇到的朋友中有好多也说不清堆栈,所以我想有必要给大家分享一下我对堆栈的看法,有说的不对的地方请朋友们不吝赐教,这对于大家学习会有很大帮助. 一.数据结构中的栈和堆 首先在数据结构上要知道堆栈,尽管我们这么称

C语言中字符型和字符串型的区别?

C语言中只有字符型类型,没有字符串型类型.字符类型用一个带符号的8位二进制编码表示,其性质与int相同,只是只有一个字节.表示字符的ASCII编码使用其中的0~127,所以要明白字符类型(char)其实是一个一字节整型,并不只用来表示字符.由于C中没有字符串类型,所以在处理字符串时是利用字符型数组来实现的,在字符型数组中一个接一个地存储字符的ASCII编码,并在最后一个字符后加一个'\0'表示这一串字符结束了,就形成所谓“字符串”.