流和文件

流:

流是数据的传输方式;C程序处理一个流而不是直接处理文件。你声明一个FILE *fp ,并把fopen(某个文件)返回的值赋予fp这两个动作就相当于建立了一个水龙头,
当你用getc(fp)之类的输入函数读取文件字符时就相当于拧开了水龙头,每读取一个字符,这个文件就像水一样的流动一下,fp所指的地址自然就向后移动了一位。这个过程就像是文件在流动一样,抽象为“流”的概念,其实就是一种传输方式;按照不同的分类方法,流又可以分为输入流、输出流,文本流和二进制流等
数据流是一组有顺序、有起点和终点的字符集合,是对信息的输入输出的一种抽象。这就好比有两个水池,一个水池用来存放信息,另一个水池用来存放程序。在这两个水池中间有两个管子,一个管子的水只能从存放信息的池子流向存放程序的池子,而另一个管子的水只能从存放程序的池子流向存放信息的池子。通过管子的水则称为数据流。当需要输入时,存放信息的池子里的水通过管子流向存放程序的池子。当需要输出时,存放程序的池子里的水通过管子流向存放信息的池子。

说明:数据流分为输入流(InputStream)和输出流(OutputStream)。输入流只能从中读取数据,而不能向其写入数据。输出流只能向其写入数据,而不能从中读取数据。



文件:

"文件"是指一组相关数据的有序集合



文本文件与二进制文件在计算机文件系统中的物理存储都是二进制的,也就是在物理存储方面没有区别都是01码,这个没有异议,他们的区别主要在逻辑存储上,也就是编码上。
文本文件格式存储时是将值作为字符然后存入其字符编码的二进制,文本文件用‘字符’作为单位来表示和存储数据,比如对于1这个值,文本文件会将其看做字符‘1’然后保存其ASCII编码值(这里假定是ASCII编码),这样在物理上就是0x31这个二进制值,而若是二进制保存1,则直接保存其二进制值,比如如果程序中是处理1为整数则保存的二进制值就是 0x00000001 (4字节)。
当然如果程序本来就是按字符保存的 也就是 char ch ='1' ;    则二进制保存后值就是其ASCII码,因为该变量的二进制本来就是其ASCII码。可以总结出二进制文件就是值本身的编码,那么就是不定长的编码了,因为值本身就是不等字节的,如整数4个字节那么保存在二进制文件就是这四个字节的原生二进制值。

综上,可以知道文本文件与二进制文件就是编码方式不一样而已,而这个是用户行为,把一个数据以什么样的编码(字符还是值本身)存入文件是由用户主动选择的,也就是写入的接口选择,如果以二进制接口方式写入文件那么就是一个二进制文件,如果以字符方式写入文件就是一个文本文件了。既然有写入时候的编码也就会有读出的编码,只有两个编码对应才能读出正确的结果,如用记事本打开一个二进制文件会呈现乱码的,这里稍微提一下后缀名,后缀名并不能确定其是否就是文本文件,二进制文件也可以是txt后缀名,后缀名只是用来关联打开程序,给用户做备注用的,与文件的具体编码没有关系。

可以使用字符接口读写二进制文件,只需要做些处理即可,所以所谓的二进制文件,文本文件主要体现在读写方式这里。
此外windows有一个明显的区别是对待文本文件读写的时候,会将换行 \n自动替换成 \r\n。



计算机的存储在物理上是二进制的,所以文本文件与二进制文件的区别并不是物理上的,而是逻辑上的。这两者只是在编码层次上有差异。
简单来说,文本文件是基于字符编码的文件,常见的编码有ASCII编码,UNICODE编码等等。二进制文件是基于值编码的文件,你可以根据具体应用,指定某个值(可以看作是自定义编码)。
从上面可以看出文本文件基本上是定长编码的(也有非定长的编码如UTF-8),基于字符,每个字符在具体编码中是固定的,ASCII码是8个比特的编码,UNICODE一般占16个比特。而二进制文件可看成是变长编码的,因为是值编码,多少个比特代表一个值,完全由自己决定。
存取

文本工具打开一个文件,首先读取文件物理上所对应的二进制比特流,然后按照所选择的解码方式来解释这个流,然后将解释结果显示出来。一般来说,你选取的解码方式会是ASCII码形式(ASCII码的一个字符是8个比特),接下来,它8个比特8个比特地来解释这个文件流。记事本无论打开什么文件都按既定的字符编码工作(如ASCII码),所以当他打开二进制文件时,出现乱码也是很必然的一件事情了,解码和译码不对应。
文本文件的存储与其读取基本上是个逆过程。而二进制文件的存取与文本文件的存取差不多,只是编/解码方式不同而已。
优缺点

因为文本文件与二进制文件的区别仅仅是编码上不同,所以他们的优缺点就是编码的优缺点。一般认为,文本文件编码基于字符定长,译码容易;二进制文件编码是变长的,所以它灵活,存储利用率要高些,译码难一些(不同的二进制文件格式,有不同的译码方式)。

转载于:https://www.cnblogs.com/wfwenchao/p/4881979.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/574256.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

小球进盒子C语言,N个小球放进M个盒子算法-Go语言中文社区

N个小球放入M个盒子共有多少种方法,并输出的算法设计:算法思路1 :暴力填充盒子每个小球都可能放入M个盒子的任意一个,所以直接根据小球个数做递归即可,然后将存储放入hash中排重//TODO算法思路2 :递归填充盒子即&#…

r语言c5.0要求因子输出,R语言中因子的创建与使用

原标题:R语言中因子的创建与使用因子在R语言中可以用来表示名义型变量或有序变量。名义变量一般表示类别,如性别,种族等等。有序变量是有一定排序顺序的变量,如职称,年级等等。在R语言中,名义变量和有序变量…

WinForm中使用AnyCAD三维控件 の 初始化

在WinForm中可以方便的集成AnyCAD.Net三维控件,只需要以下几部即可完成。 一、添加DLL程序集 AnyCAD.Foundation.Net.dll AnyCAD.Presentation.Net.dll AnyCAD.Exchange.Net.dll 二、初始化控件 1.首先创建一个窗体 2.在窗体上放置一个Panel用来放置三维控件 3.初始…

linux中nodejs后台运行工具forever

forever让nodejs应用后台执行 命令如下: forever start ./bin/www nodejs一般是当成一条用户命令执行的,当用户断开客户连接,运用也就停了,很烦人。如何让nodejs应用当成服务,在后台执行呢? 最简单的办法(不…

android启动其他app的服务器,Android中通过外部程序启动App的三种方法

这篇文章主要介绍了Android中通过外部程序启动App的三种方法,本文讲解了直接通过包名、通过自定义的Action、通过Scheme三种方法,并分别给出操作代码,需要的朋友可以参考下第一种:直接通过包名:复制代码 代码如下:Intent LaunchIntent getPackageManage…

linux date 天之前,linux date命令前后几天的推导

linux date使用(前后几天时间推导)在Linux系统 中,可以采用如下方法:1) 取之前的时间:date -d "a day ago" %Y%m%d 取出前1天的系统时间date -d "2 days ago" %Y%m%d 取出前2天的系统时间2) 取之后的时间:dat…

各种封装——封装getClass

因为用Class获取元素时,有兼容性问题,需要分情况获取 显示判断是否可以用getElementsByClassName,若是不介意用就要先获取全部的元素,在用正则判断 function getClass(oParent,sClass){if(oParent.getElementsByClassName){return…

android提示程序正在执行,Android中获取正在运行的进程(一)

关于android中应用程序正在运行的进程有下面几种:1-包含services的进程,2-不包含services的进程,3-杀死应用时有些进程被init回收(类似于僵尸进程),ppid变为1,无法通过android 应用层代码获得的进程。这些进程可能是应…

jta 知识

JTA知识(转载原文地址:http://blog.csdn.net/it_man/article/details/7230215) Java Transaction API,译为Java事务API。JTA允许应用程序执行分布式事务处理——在两个或多个网络计算机资源上访问并且更新数据。JTA主要用于分布式…

android l usb调试,你居然还不会手机usb调试?5个方法,让你轻松学会设置!

原标题:你居然还不会手机usb调试?5个方法,让你轻松学会设置!最近有位朋友将手机连接电脑的时候,遇到了提示打开手机的USB调试模式,却不知道怎么操作。其实,不同手机的usb调试打开的方式都会有所…

深入沟通的重要性——《大道至简》第四章读后感

我们都知道,一个新发明如果不被人们所需要,那只是一个失败品。一篇文章的观点如果不被人们所接受,那么就算文笔再好,也只是一张废纸。同样的,一个与客户需求不符的程序,哪怕它的架构再好,都只是…

鸿蒙os芯片,没有了芯片,华为能靠鸿蒙OS系统打出差异化吗?

原标题:没有了芯片,华为能靠鸿蒙OS系统打出差异化吗?华为今天要和大家说的手机产品是华为,在目前的市场中,华为手机的影响力是非常大的,并且获得了十分不错的销量,甚至在最近一段时间销量超过三…

html5 canvas 不兼容safari浏览器_HTML5简介

HTML5 是继 HTML4.01 和 XHTML1.0 之后的超文本标记语言的最新版本。它是由一群自由思想者组成的团队设计出来,并最终实现多媒体支持、交互性、更加智能的表单,以及更好的语义化标记。HTML5 并不仅仅是 HTML 规范的最新版本,而是一系列用来制…

html5置顶标签css样式,html5 header标签 html header css布局教程 /header

在HTML5版本之前习惯使用div标签布局网页,在HTML5在DIV标签基础上新增header标签元素。也叫“”头部标签。以前我们在div css布局中常常把网页大致分为头部、内容、底部。对于大结构我们常常使用div里加id进行布局。而头部常常使用正应为大家公认html布局中对“head…

DML数据操作语言练习

--创建表T_HQ_BM2 --create table t_hq_bm2 as select * from t_hq_bm; commit;--添加行内容 --insert into t_hq_bm2 values (107,研发部,147258369); commit;--删除部门编码为107的行 --delete t_hq_bm2 where bumenbm 107; commit;--添加行内容 --insert into t_hq_bm2 (bu…

第八届育才杯机器人比赛_赛场、名单公布!南海区第八届“献血者杯”羽毛球公开赛“羽”你相约本周六...

主办单位:南海区献血办、南海血站协办单位:南海区羽毛球协会为进一步扩大无偿献血宣传,感恩南海区献血者,活跃无偿献血者的文体生活,打造一个南海区无偿献血者交流的平台,共同营造“运动、健康、献血、快乐…

2021届安徽高考成绩查询,安徽2021年高考成绩什么时候公布

据安徽省教育招生考试院透露,安徽预计将于6月23日公布各批次录取分数线、考生成绩。2021年安徽高考成绩查询入口2021年高考录取方法1、普通高校的招生录取工作在教育部和省高校招生委员会的领导下,由省考试院组织实施。2、省高校招生委员会根据当年高校在…

BroadcastReceiver 广播机制详解

BroadcastReceiver也就是“广播接收者”的意思,顾名思义,它就是用来接收来自系统和应用中的广播。 在Android系统中,广播体现在方方面面,例如当开机完成后系统会产生一条广播,接收到这条广播就能实现开机启动服务的功能…

会话管理 轻量php框架_SpringSecurity+JWT权限管理训练营-1基于RBAC模型的权限管理系统...

1.什么是权限管理系统?权限管理是一个几乎所有后台系统的都会涉及的一个重要组成部分,可以说是后台项目的基本功,主要目的是对整个后台管理系统进行权限的控制,而针对的对象是员工,避免因权限控制缺失或操作不当引发的…

2021宣城职业技术学院对口高考成绩查询,2021年宣城职业技术学院高考录取通知书查询 通知书什么时候可以收到...

高考志愿填报后最重要的一件事情就是高考录取通知书的查收了,因为录取通知书才是证明你被录取的有效方式。那么很多考生及家长最关心怎么查询宣城职业技术学院录取通知书?宣城职业技术学院录取通知书寄到哪里了?本文大风车网小编为你整理了关…