【C语法学习】14 - 流和文件

文章目录

  • [1 流](#1 流)
    • [1.1 概念](#1.1 概念)
    • [1.2 优点](#1.2 优点)
    • [1.3 分类](#1.3 分类)
      • [1.3.1 输入流和输出流](#1.3.1 输入流和输出流)
      • [1.3.2 标准流和文件流](#1.3.2 标准流和文件流)
        • [1.3.2.1 标准流](#1.3.2.1 标准流)
        • [1.3.2.2 文件流](#1.3.2.2 文件流)
      • [1.3.3 文本流和二进制流](#1.3.3 文本流和二进制流)
  • [4 文件](#4 文件)
    • [4.1 分类](#4.1 分类)
    • [4.2 区别](#4.2 区别)

1 流

1.1 概念

"流"的概念比较抽象,经典C语言书籍《C Primer Plus》中是这样描述的:流(stream)是一个理想化的数据流,实际输入或输出映射到这个数据流。网络上关于"流"的解释也是五花八门、见仁见智。

个人理解如下:

(1)"流"是外设(如键盘、屏幕、打印机、磁盘等)在程序中的映射或镜像;

(2)程序不关心外设的具体形态,而是使用"流"的概念将外设抽象化,然后通过对"流"的操作来实现对外设读写访问的标准化和归一化;

(3)程序从键盘输入、向屏幕输出、读写磁盘文件等功能都是通过输入/输出函数对输入/输出"流"的操作来实现的;

(4)"流"在程序中的具象化是一个指向FILE类型结构的指针;

1.2 优点

"流"的优点主要体现在对磁盘文件的读写操作上:

  1. "流"的使用可以简化对文件的操作,提供了统一的接口来处理不同类型的输入输出;
  2. 通过使用"流",可以实现对文件的逐行读取、格式化输入输出等操作,方便了程序的编写和维护;
  3. "流"提供了缓冲区的功能,可以提高文件的读写效率。

1.3 分类

1.3.1 输入流和输出流

"流"*按照流动方向可分为输入流和输出流:流入程序的字节序列称为输入流;流出程序的字节序列称为输出流。

1.3.2 标准流和文件流

"流"按照操作对象可分为标准流和文件流。

1.3.2.1 标准流

标准流包括标准输入流(stdin)、标准输出流(stdout)和标准错误流(stderr)。标准流在程序开始执行时被自动打开,在程序结束执行时自动关闭。标准流在程序中可以直接使用(#include stdio.h)。

与标准流相关的外设如下图所示:

与标准流相关的常用库函数有:

  1. 输入函数:getchar()、gets()和scanf()等;
  2. 输出函数:putchar()、puts()和printf()等;
1.3.2.2 文件流

文件流是用于读写磁盘文件的"流",这类"流"需要程序设计人员显示的指定。

首先,打开文件流就是创建文件流和文件关联起来;

其次,使用输入/输出函数操作文件流对文件进行读写,如fgets()函数、fputs()函数等;

最后,关闭文件流。

注意:程序无法直接打开文件,只能打开文件流;"打开文件"和"关闭文件"其实是指"打开文件流"和"关闭文件流";也就是说,fopen创建与文件关联的文件流并打开文件流,fclose关闭文件流。

1.3.3 文本流和二进制流

"流"按照承载内容可分为文本流和二进制流。

文件可分为文本文件和二进制文件;文本流和文本文件相关联,二进制流和二进制文件相关联。

4 文件

4.1 分类

C语言将文件分为文本文件和二进制文件。主要目的是为了提供不同的读取和写入方式,以适应不同类型文件的特点和需求。文本文件适合存储和处理可读的文本数据,而二进制文件适合存储和处理各种类型的数据,包括非文本数据。

文本文件

文本文件是由字符组成的文件,其中的字符可以是可打印字符(如字母、数字、标点符号等)和控制字符(如换行符、制表符等)。文本文件通常以ASCII码或Unicode编码进行表示。在读取和写入文本文件时,C语言提供了一些特定的函数(如fgets()、fputs()、fprintf()等)来处理字符的输入和输出。

二进制文件

二进制文件是由字节组成的文件,其中的字节可以表示任意类型的数据,包括整数、浮点数、结构体等。二进制文件不使用特定的字符编码,而是直接按照字节的形式存储数据。在读取和写入二进制文件时,C语言提供了一些特定的函数(如fread()、fwrite()等)来处理字节的输入和输出。

注意:

  1. 二进制文件可以存储文本数据,因为二进制文件是以字节流的形式存储数据,可以表示任意类型的数据,包括文本数据;
  2. 文本文件不太适合存储二进制数据,因为二进制数据可能包含不可打印的字符,如控制字符、非ASCII字符等,这些字符在文本文件中可能会被转换或丢失,导致数据损坏。

4.2 区别

在C语言中,文本文件和二进制文件是根据文件中存储的数据类型和存储方式的不同进行区分的。

  1. 数据类型:文本文件中存储的是可打印字符,如字母、数字、标点符号等,而二进制文件中存储的是字节流,可以表示任意类型的数据,包括整数、浮点数、结构体等。

  2. 存储方式:文本文件使用字符编码(如ASCII码或Unicode编码)来表示字符,每个字符占用一个或多个字节,而二进制文件直接以字节的形式存储数据,没有特定的字符编码。

  3. 可读性:文本文件可以直接使用文本编辑器打开查看,内容可以被人类读取和理解。而二进制文件不可直接被人类读取和理解,需要使用特定的程序进行解析和处理。

  4. 大小:由于文本文件使用字符编码来表示字符,每个字符占用一个或多个字节,所以文本文件的大小通常会比二进制文件大。

  5. 兼容性:文本文件在不同操作系统之间具有较好的兼容性,因为字符编码是通用的。而二进制文件的兼容性较差,因为不同操作系统可能使用不同的字节顺序和数据格式。

相关推荐
XH华2 小时前
初识C语言之二维数组(下)
c语言·算法
Uu_05kkq5 小时前
【C语言1】C语言常见概念(总结复习篇)——库函数、ASCII码、转义字符
c语言·数据结构·算法
嵌入式科普7 小时前
十一、从0开始卷出一个新项目之瑞萨RA6M5串口DTC接收不定长
c语言·stm32·cubeide·e2studio·ra6m5·dma接收不定长
A懿轩A7 小时前
C/C++ 数据结构与算法【栈和队列】 栈+队列详细解析【日常学习,考研必备】带图+详细代码
c语言·数据结构·c++·学习·考研·算法·栈和队列
1 9 J9 小时前
数据结构 C/C++(实验五:图)
c语言·数据结构·c++·学习·算法
仍然探索未知中10 小时前
C语言经典100例
c语言
爱吃西瓜的小菜鸡10 小时前
【C语言】矩阵乘法
c语言·学习·算法
Stark、11 小时前
【Linux】文件IO--fcntl/lseek/阻塞与非阻塞/文件偏移
linux·运维·服务器·c语言·后端
deja vu水中芭蕾12 小时前
嵌入式C面试
c语言·开发语言
stm 学习ing13 小时前
HDLBits训练3
c语言·经验分享·笔记·算法·fpga·eda·verilog hdl