c语言访问磁盘文件类型,文件到底是什么

# 简述

**磁盘文件和设备文件**

* 磁盘文件

指一组相关数据的有序集合,通常存储在外部介质上(如磁盘)上,使用时才调入内存

* 设备文件

在操作系统中把每一个与主机相连的输入,输出设备看作一个文件,把他们的输入,输出等同于对磁盘文件的读和写

**磁盘文件的分类**

计算机的存储在物理上是二进制的,所以物理上所有的磁盘文件本质上都是一样的:以字节为单位进行顺序存储

从用户或者操作系统使用者的角度(逻辑上)把文件分为:

* 文本文件: 基于字符编码的文件

* 二进制文件: 基于值编码的文件

**文本文件和二进制文件**

**文本文件**

* 基于字符编码,常见编码有ASCII,UNICODE等

* 一般可以使用文本编辑器直接打开

* 数5678的以ASCII存储形式(ASCII码)为:

`00110101 00110110 00110111 00111000`

**二进制文件**

* 基于值编码,自己根据具体应用,指定某个值是什么意思

* **把内存中的数据按其在内存中的存储形式原样输出到磁盘上**

* 数5678的存储形式(二进制码)为: `00010110 00101110`

我们对文件的概念已经非常熟悉了,比如常见的 Word 文档、txt 文件、源文件等。文件是数据源的一种,最主要的作用是保存数据。

在操作系统中,为了统一对各种硬件的操作,简化接口,不同的硬件设备也都被看成一个文件。对这些文件的操作,等同于对磁盘上普通文件的操作。例如:

* 通常把显示器称为标准输出文件,printf 就是向这个文件输出数据;

* 通常把键盘称为标准输入文件,scanf 就是从这个文件读取数据。

![](https://box.kancloud.cn/7d5f7c7cad29e725211501f4e129edea_612x206.png)

操作文件的正确流程为:`打开文件 --> 读写文件 --> 关闭文件`。文件在进行读写操作之前要先打开,使用完毕要关闭。

所谓打开文件,就是获取文件的有关信息,例如文件名、文件状态、当前读写位置等,这些信息会被保存到一个 FILE 类型的结构体变量中。关闭文件就是断开与文件之间的联系,释放结构体变量,同时禁止再对该文件进行操作。

在C语言中,文件有多种读写方式,可以一个字符一个字符地读取,也可以读取一整行,还可以读取若干个字节。文件的读写位置也非常灵活,可以从文件开头读取,也可以从中间位置读取。

# 文件流

所有的文件(保存在磁盘)都要载入内存才能处理,所有的数据必须写入文件(磁盘)才不会丢失。数据在文件和内存之间传递的过程叫做文件流,类似水从一个地方流动到另一个地方。数据从文件复制到内存的过程叫做输入流,从内存保存到文件的过程叫做输出流。

文件是数据源的一种,除了文件,还有数据库、网络、键盘等;数据传递到内存也就是保存到C语言的变量(例如整数、字符串、数组、缓冲区等)。我们把数据在数据源和程序(内存)之间传递的过程叫做数据流(Data Stream)。相应的,数据从数据源到程序(内存)的过程叫做输入流(Input Stream),从程序(内存)到数据源的过程叫做输出流(Output Stream)。

输入输出(Input output,IO)是指程序(内存)与外部设备(键盘、显示器、磁盘、其他计算机等)进行交互的操作。几乎所有的程序都有输入与输出操作,如从键盘上读取数据,从本地或网络上的文件读取数据或写入数据等。通过输入和输出操作可以从外界接收信息,或者是把信息传递给外界。

我们可以说,打开文件就是打开了一个流。

# 文本文件和二进制文件区别

根据我们以往的经验,文本文件通常用来保存肉眼可见的字符,比如`.txt`文件、`.c`文件、`.dat`文件等,用文本编辑器打开这些文件,我们能够顺利看懂文件的内容。

二进制文件通常用来保存视频、图片、程序等不可阅读的内容,用文本编辑器打开这些文件,会看到一堆乱码,根本看不懂。

但是从物理上讲,二进制文件和字符文件并没有什么区别,它们都是以二进制的形式保存在磁盘上的数据。

我们之所以能看懂文本文件的内容,是因为文本文件中采用的是 ASCII、UTF-8、GBK 等字符编码,文本编辑器可以识别出这些编码格式,并将编码值转换成字符展示出来。

而二进制文件使用的是 mp4、gif、exe 等特殊编码格式,文本编辑器并不认识这些编码格式,只能按照字符编码格式胡乱解析,所以就成了一堆乱七八糟的字符,有的甚至都没见过。

如果我们新建一个 mp4 文件,给它写入一串字符,然后再用文本编辑器打开,你一样可以读得懂,有兴趣的读者可以自己试试。

总起来说,不同类型的文件有不同的编码格式,必须使用对应的程序(软件)才能正确解析,否则就是一堆乱码,或者无法使用。

# fopen() 中的文本方式和二进制方式

在C语言中,二进制方式很简单,读取文件时,会原封不动的读出文件的全部內容,写入数据时,也是把缓冲区中的內容原封不动的写到文件中。

文本方式和二进制方式并没有本质上的区别,只是对于换行符的处理不同。

C语言程序将`\n`作为换行符,类 UNIX/Linux 系统在处理文本文件时也将`\n`作为换行符,所以程序中的数据会原封不动地写入文本文件中,反之亦然。

但是 Windows 系统却不同,它将`\r\n`作为文本文件的换行符。

在 Windows 系统中,如果以文本方式打开文件,当读取文件时,程序会将文件中所有的`\r\n`转换成一个字符`\n`。也就是说,如果文本文件中有连续的两个字符是`\r\n`,则程序会丢弃前面的`\r`,只读入`\n`。

当写入文件时,程序会将`\n`转换成`\r\n`写入。也就是说,如果要写入的内容中有字符`\n`,则在写入该字符前,程序会自动先写入一个`\r`。

因此,如果用文本方式打开二进制文件进行读写,读写的内容就可能和文件的内容有出入。

总起来说,对于 Windows 平台,为了保险起见,我们最好用`"r"`来打开文本文件,用`"b"`来打开二进制文件。对于 Linux 平台,使用`"r"`还是`"b"`都无所谓,既然默认是`"r"`,那我们什么都不写就行了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值