流动的代码:文件流畅读写的艺术(一)

文件操作

  • 什么是文件?
    • 程序文件
    • 数据文件
    • 文件名
      • 绝对路径
      • 相对路径
  • 二进制文件和文本文件
      • 文本文件
      • 二进制文件
  • 文件的打开和关闭
    • 流和标准流
      • 标准流
      • 1. 标准输入流 (stdin)
      • 2. 标准输出流 (stdout)
      • 3. 标准错误流 (stderr)
    • 文件指针
    • 文件的打开和关闭
      • mode

什么是文件?

文件可以长久保存数据,即使电脑关机或重启数据也不会丢失,通过文件可以方便地进行数据备份和恢复,以防数据丢失,且文件系统提供了一种组织数据的结构,使得数据检索和管理更加高效。那么,什么是文件呢?

文件是电子设备中用于存储数据的一种基本单位。它可以包含文本、图片、音频、视频或其他类型数据文件存储在存储介质如硬盘、SSD或者云存储上,通常有一个文件名和扩展名,这些帮助用户和系统识别文件的内容和用途。文件可以被创建、编辑、删除和移动,是数据管理和组织的重要工具。

在程序设计中,我们一般谈的文件有两种:程序文件,数据文件

程序文件

程序文件包括源程序文件(后缀为.c),目标文件(windows环境后缀为.obj),可执行程序(windows环境后缀为.exe)其用途是用来安装和运行软件应用程序

数据文件

文件的内容不一定是程序,而是程序运行时读写的数据,比如程序运行需要从中读取数据的文件,或者输出内容的文件。用途是存储数据以便永久保存或提供给程序使用。

扩展名

  • 文本文件:‘.txt’
  • 图片文件:‘.ipg’ ‘.png’ ‘.gif’
  • 音频文件:‘.mp3’ ‘.wav’
  • 视频文件: ‘.mp4’ ‘.avi’
  • 文档文件:‘.docx’ ‘.pdf’ ‘.xlsx’

程序文件的主要目的是指导计算机如何执行特定的任务,而数据文件主要用于存储由用户或程序在执行任务期间生成或使用的数据。在软件开发中,源代码文件通常也被视作程序文件,因为它们包含构成最终可执行程序的指令代码。

文件名

⼀个文件要有⼀个唯⼀的文件标识,以便用户识别和引用。
文件名包含3部分:文件路径+文件名主干+文件后缀

C:\Users\Username\Documents\report.docx

其中C:\Users\Username\Documents\是文件的路径.,主干是用户通常使用这部分来给文件命名,以表明文件的内容或用途,即report,文件后缀即为**.docx**。

绝对路径

一个绝对路径从文件系统的根目录( C:\ 在 Windows) 开始,包含了从根目录到目标文件或目录的完整序列。

C:\Users\Username\Documents\report.docx

相对路径

一个相对路径是基于当前工作目录的路径。它不从根目录开始,但提供了从当前目录到目标文件或目录的路径信息
如果当前工作目录是C:\Users\Username\Documents\report.docx则到达 Documents 目录中的 report.docx 的相对路径可以是:

Documents\report.docx

在文件路径中还有一些特殊符号,常见的有:

  • “.”:表示当前目录
  • “. .”:表示上一级目录.

二进制文件和文本文件

二进制文件和文本文件是两种基本的文件类型,它们的主要差别在于存储内容的格式和用途:

文本文件

  • 内容:由字符组成,如字母、数字和符号。这些字符通常是可读的,并且编码格式通常是ASCIIUnicode
  • 用途:用于存储诸如文本文档、代码文件或任何可用标准文本编辑器读写的数据。
  • 特点:内容可通过文本编辑器如记事本或IDE查看和编辑,具有良好的可读性和兼容性。

二进制文件

  • 内容:包含以二进制形式存储的数据,可以表示各种类型的数据,如图像、视频、可执行程序等。
  • 用途:用于存储应用程序、图像、视频、音频等需要丰富或复杂数据结构的文件。
  • 特点:通常不可读,需要特定的程序或解释器来读取和处理。例如,图像查看器能解析图像文件,而文本编辑器则可能无法正确显示。

主要区别

  • 可读性:文本文件可读性强,可以直接被人阅读和编辑。二进制文件通常需要特定软件来解读。
  • 数据表示:文本文件仅包含基本的文本数据,而二进制文件可以包含更复杂的数据类型,包括编译后的程序代码、图像、音频等。
  • 效率:二进制文件在表示复杂数据结构时通常更加紧凑和效率高,但这也意味着它们对特定平台或应用更加依赖。

数据在内存中以二进制的形式存储,如果不加转换的输出到外存,就是二进制文件
如果要求在外存上以ASCII码的形式存储,则需要在存储前转换。以ASCII字符的形式存储的文件就是文本文件

数据在字符中的存储,字符一律以ASCII形式存储,数值型数据既可以用ASCII形式,也可以用二进制形式存储

例如整数10000,以ASCII形式输出到硬盘,占五个字节(每一位一个),若以二进制形式输出,则占四个字节.
流动的代码:文件流畅读写的艺术(一)_第1张图片
测试代码:

#define _CRT_SECURE_NO_WARNINGS 1
#include 
int main()
{
	int a = 10000; 
	FILE* pf = fopen("test1.txt", "wb");
	fwrite(&a, 4, 1, pf);//二进制的形式写到文件中
	fclose(pf);
	pf = NULL;
	return 0;
}

10000以二进制形式写入文件中,生成txt文件
流动的代码:文件流畅读写的艺术(一)_第2张图片
用记事本打开
在这里插入图片描述
用vs以二进制编辑器打开
流动的代码:文件流畅读写的艺术(一)_第3张图片
流动的代码:文件流畅读写的艺术(一)_第4张图片
流动的代码:文件流畅读写的艺术(一)_第5张图片
我们会发现,这串数字即为10000十六进制的小端存储

文件的打开和关闭

流和标准流

流用来表示数据的一种流动序列。程序的数据需要输出到各种外部设备,也需要从外部设备获取数据,不同的外部设备的输入输出操作各不相同,为了方便程序员对各种设备进行方便的操作,我们抽象出了的概念

流的种类

  • 输入流:用来从源(如文件、网络、键盘等)读取数据到程序中。
  • 输出流:用来将数据写出到目的地(如文件、网络、显示器等)。

流的操作

  • 打开流:在使用流之前,首先需要打开它,类似于打开一个文件或建立一个网络连接。
  • 读/写操作:对流进行读取或者写入数据的操作,这些操作可以是同步的也可以是异步的。
  • 缓冲区管理:对内部缓冲区进行操作,如刷新缓冲区,以确保所有数据都被正确写出或读入。
  • 关闭流:完成数据传输后,关闭流以释放系统资源。

通俗易懂的讲 流在计算机里,就像是一条河流,数据就像是河里的水。想象一下,河水从一个地方(数据源)流向另一个地方(目的地)。这个过程就很像计算机中数据从一个点流向另一个点的情形。

举个例子:

  1. 读取文件:当你打开一个文本文件,数据(文字)从文件(数据源)流到计算机程序(目的地),就像水从水库流向你家的水龙头。

  2. 保存文件:当你写东西保存到电脑,文字从程序(数据源)流向文件(目的地),这就像你用水管将水流入水池。

  3. 听音乐:想象音乐播放器在播放歌曲。音乐数据从文件(数据源)流到音乐播放器(目的地),然后变成你能听到的声音。

在计算机中,“流” 让我们不用担心数据是从哪里来的,要去哪里。我们只需要关注于数据流动的这个过程,就像你只需打开水龙头,不用关心水是怎么来的一样。这样,无论数据是来自网络、文件还是其他什么地方,处理起来都是一样的。

标准流

在计算机中,特别是在命令行接口中,"标准流"是程序进行输入和输出操作的常见方式。这些标准流为程序提供了一个基本的接口来和外界交流数据。标准流通常有三个:

1. 标准输入流 (stdin)

  • 作用:它是程序读取输入的地方。通常情况下,标准输入流来自键盘,scanf函数就是从标准输入流中读取数据。
  • 通俗解释:就像电话的话筒,你通过它说话,另一边的程序可以听到

2. 标准输出流 (stdout)

  • 作用:程序通常通过标准输出流发送数据和信息,最常见的输出目的地是显示器屏幕,printf函数就是将信息输出到标准输出流中
  • 通俗解释:就像电话的听筒,你可以通过它听到程序"说"的东西

3. 标准错误流 (stderr)

  • 作用:它是专门用于输出错误信息的流。即使标准输出被重定向到其他地方(比如文件),错误信息通常仍然会显示在屏幕上,这样就可以同时看到正常的输出和可能出现的错误
  • 通俗解释:如果标准输出好比日常对话,那么标准错误就像是紧急情况下的报警器,用于提醒注意特定的问题

这些流在正常情况下连接到你的终端或命令行界面

  • 当你在命令行中运行一个命令或程序时,你通过键盘输入信息,这些信息通过标准输入流进入程序。
  • 程序运行后,所有通常的输出都会通过标准输出流呈现在屏幕上。
  • 如果程序发生错误,错误信息会通过标准错误流显示出来,这样即使标准输出被重定向,你也不会错过错误信息。

标准流让程序和用户之间的交流变得简单直观。正如你不需要知道电话线路如何工作就能打电话一样,程序员和用户也不需要操心数据在计算机内部是如何传输的,标准流会帮你处理这些。

stdin、stdout、stderr 三个流的类型是: FILE* ,通常称为文件指针
C语言中,就是通过 FILE* 的文件指针来维护流的各种操作的。

文件指针

文件指针是在进行文件操作时用于追踪当前读取或写入位置的一个工具。它是文件处理中一个重要的概念,特别是在需要对文件内容进行随机访问时。简单来说,文件指针就像是你在书本上放的书签,标记着你当前阅读到哪一页。
每个被使用的文件都在内存中开辟了⼀个相应的文件信息区,用来存放文件的相关信息(如文件的名字,文件状态及文件当前的位置等)。这些信息是保存在一个结构体变量中的。该结构体类型是由系统声明的,取名FILE.
每当打开⼀个文件的时候,系统会根据文件的情况自动创建⼀个FILE结构的变量,并填充其中的信息,使用者不必关心细节。
一般都是通过⼀个FILE的指针来维护这个FILE结构的变量,这样使用起来更加方便。

FILE *fp

定义pf是⼀个指向FILE类型数据的指针变量。可以使pf指向某个文件的文件信息区(是⼀个结构体变量)。通过该文件信息区中的信息就能够访问该文件。也就是说,通过文件指针变量能够间接找到与它关联的文件。

假设你正在使用一个文本编辑器查看一个文本文件。当你向下滚动页面时,文件指针也在移动,指向你当前视图的开始位置。如果你选择跳转到文件的中间,文件指针会相应地移动到文件的中间部分

文件的打开和关闭

在编写程序的时候,在打开文件的同时,都会返回⼀个FILE*的指针变量指向该文件,也相当于建立了指针和文件的关系。
ANSIC 规定使用 fopen 函数来打开文件, fclose 来关闭文件。

fopen 是 C 语言中用于打开文件的标准库函数。它的功能是打开一个文件,并返回一个指向 FILE 结构体的指针,该结构体包含了所有用于文件操作的必要信息。如果文件打开失败,fopen 会返回 NULL

FILE *fopen(const char *filename, const char *mode);
  • filename:要打开的文件名。
  • mode:文件的打开模式。

fclose 是 C 语言中的一个标准库函数,用于关闭已经打开的文件,它可以帮助防止数据丢失和文件损坏

int fclose(FILE *stream);
  • stream:指向 FILE 对象的指针,该 FILE 对象由之前成功的 fopen 调用返回。
  • 如果成功关闭文件,fclose 返回 0。
  • 如果关闭过程中出现错误,它会返回,并且错误码会被设置在全局变量 errno 中。

mode

mode表示文件的打开模式,下面有多种类型:

  • r(只读):为了输入数据,打开一个已经存在的文本文件,如果指定文件不存在,则出错
  • w(只写):为了输出数据,打开一个文本文件,如果指定文件不存在,则建立一个新的文件
  • a(追加):向文本文件尾添加数据,如果指定文件不存在,则建立一个新的文件
  • rb(只读):为了输入数据,打开一个二进制文件,如果指定文件不存在,则出错
  • wb(只写):为了输出数据,打开一个二进制文件,如果指定文件不存在,则建立一个新的文件
  • ab(追加):向一个二进制文件尾添加数据,如果指定文件不存在,则建立一个新的文件
  • r+(读写):为了读和写,打开一个文本文件,如果指定文件不存在,则出错
  • w+(读写):为了读和写,建立一个新的文件
  • a+(读写):打开一个文件,在文件尾进行续写。
  • rb+(读写):为了读和写打开一个二进制文件

示例:

FILE *file = fopen("example.txt", "r");
if (file == NULL) {
    // 错误处理,例如打印错误信息
    perror("Error opening file");
} else {
    // 文件操作
    // ...

    fclose(file);  // 最后不要忘记关闭文件
}

本篇文章到此结束,后续会为大家更新剩余内容,感谢观看!!!

你可能感兴趣的:(c语言)