C语言中文件是什么?文件文本和二进制文件的区别

server/2024/12/20 3:10:51/

1、C语言中文件是什么?

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

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

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

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

我们不去探讨硬件设备是如何被映射成文件的,大家只需要记住,在 C 语言中硬件设备可以看成文件,有些输入输出函数不需要你指明到底读写哪个文件,系统已经为它们设置了默认的文件,当然你也可以更改,例如让 printf 向磁盘上的文件输出数据。

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

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

文件流

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

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

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

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

2、文件文本和二进制文件的区别 

 在学习了 fopen() 函数后,我们知道它的第二个参数是一个字符串,用来表示文件打开方式。如果字符串中出现 b,则表示以二进制方式打开文件;如果字符串中出现 t,或者两者都不出现,则表示以文本方式打开文件。

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

根据我们以往的经验,文本文件通常用来保存肉眼可见的字符,比如.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 平台,为了保险起见,我们最好用"t"来打开文本文件,用"b"来打开二进制文件。对于 Linux 平台,使用"r"还是"b"都无所谓,既然默认是"r",那我们什么都不写就行了。


http://www.ppmy.cn/server/151601.html

相关文章

Qt-对话框使用总结

参考文章链接: Qt对话框之一:标准对话框 Qt对话框之二:模态、非模态、半模态对话框 标准对话框 颜色对话框 颜色对话框类 QColorDialog 提供了一个可以获取指定颜色的对话框部件。 /*** 第一种方式 ***/ //QColor color = QColorDialog::getColor(Qt::red, this,…

配置flutter 解决andriod studio报错 no device selected

flutter配置好后 明明下载好了模拟器 但是在andriod studio 找不到设备 显示no devices 这个时候需要我们配置一下flutter关联的android sdk的路径和文件夹 就可以解决了 flutter config --android-sdk 自己android studio的路径 这样配置就可以解决了~

C语言学习day23:WriteProcessMemory函数/游戏内存数据修改工具开发

简言: 上一章我们说了获取应用进程的某数据(data),这一章我们就说说修改内存地址的数据。想要修改内存,那么就需要我们另一个WinAPI函数:WriteProcessMemory()函数。 WriteProcessMemory()函数 函数原型…

【Docker】Docker安装MongoDB最新版并连接使用附加docker常用命令

前言 确保centos7已经安装docker,没安装docker的可以百度自行安装 一、docker安装mongodb步骤 1、docker拉取mongo镜像 docker pull mongo:latest2、查看本地镜像命令 #查看镜像命令 docker images#查看正在运行的容器 docker ps#查看全部的容器 docker ps -a3…

【NLP】第六章:位置编码Positional Encoding

六、位置编码Positional Encoding (一)为什么需要位置编码器? 前面我们花了大幅的笔墨、详细的描述了embedding层和注意力模块的计算流程,可以看出attention模块确实是学习了样本于样本之间的关系。每个样本都计算了它和所有样本…

WPF+MVVM案例实战与特效(四十一)-WPF文本到几何路径转换的艺术:轻松实现自定义字体路径生成

文章目录 1、引言2、应用场景3、案例实现1、代码实现2、字体路径应用3、运行效果4、总结1、引言 在 WPF 开发中,将文本转换为几何路径(Geometry)是一个强大但鲜为人知的功能。它不仅允许我们创建复杂的图形效果,还能让我们对文本进行更精细的控制和定制。本文将深入探讨如…

Message Processing With Spring Integration高级应用:自定义消息通道与端点

一、Spring Integration 简介 Spring Integration 是 Spring 框架的扩展,支持企业集成模式(EIP),提供轻量级的消息处理功能,帮助开发者构建可维护、可测试的企业集成解决方案。 核心目标: 提供简单的模型…

「iOS」通过CoreLocation Framework深入了解MVC架构

「iOS」通过CoreLocation Framework重新了解多界面传值以及MVC架构 文章目录 「iOS」通过CoreLocation Framework重新了解多界面传值以及MVC架构前言CoreLocation了解根据需求建模设计属性方法设计协议传值Block传值KVONotification通知方式 总结参考文章 前言 在这个学期的前…