目录
1.为什么使用文件?
如果没有文件。我们所写的程序的数据是存储在电脑的内存中,如果程序退出,内存回收,数据就会被丢失,等再次运行程序,是看不到上次程序的数据的,如果要将数据进行持久化的保存,就需要使用相关的文件操作了。
2.什么是文件?
在计算机科学中,文件是存储在辅助存储设备(如硬盘驱动器、固态硬盘、光盘等)上的一组相关信息的集合。文件是操作系统管理数据的基本单位,它可以包含文本、图像、声音、视频或其他任何类型的数据。
文件通常由以下部分组成:
-
数据:文件的内容,可以是文本、图像、音频、视频或其他二进制数据。
-
文件名:用于标识文件的字符串,通常包括主文件名和扩展名(如 “document.txt” 中的 “document” 是主文件名,“txt” 是扩展名)。
-
属性:文件的一些元数据,如创建日期、最后修改日期、文件大小、文件所有者、访问权限等。
-
文件类型:根据文件的内容和用途,文件可以被分类为不同的类型,如文本文件、可执行文件、图像文件等。
-
路径:文件在文件系统中的位置,通常包括目录的层次结构。
文件可以被创建、读取、写入、复制、移动和删除。操作系统提供了文件系统来管理这些文件,文件系统负责文件的存储、检索和组织。在编程中,文件操作是指程序对文件执行的各种操作,如打开文件、读取文件内容、写入数据到文件、关闭文件等。这些操作允许程序与用户和其他程序交换信息,并实现数据的持久化存储。
2.1程序文件
程序文件包括源程序文件(后缀为.c),目标文件(windows环境后缀为.obj),可执行程序(windows环境后缀为.exe)。
2.2数据文件
文件的内容不一定是程序,而是程序运行的数据,比如程序运行需要从中读取的文件,或者输出内容的文件。
在以前各章所处理数据的输入输出都是以终端为对象的,即从终端的键盘输入数据,运行结果显示到显示器上。其实有时候我们会把信息输出到磁盘上,当需要的时候再从磁盘上把数据读取到内存中使用,这里处理的就是磁盘上文件。
2.3文件名
一个文件要有一个唯一的文件标识,以便用户识别和引用。
文件名包括3部分:文件路劲+文件名主干+文件后缀
为了方便起见,文件标识被称为文件名。
3.二进制文件和文本文件
在计算机科学中,文件通常根据它们包含的数据类型和用途被分类。二进制文件和数据文件是两种常见的文件类型,它们有各自的特点和用途。
3.1二进制文件
二进制文件是一种包含二进制数据的文件,即由0和1组成的计算机可以直接理解和执行的数据。二进制文件通常用于存储程序指令、图像、音频、视频等非文本数据。它们是计算机硬件和软件通信的桥梁,因为计算机的处理器直接操作二进制指令。
二进制文件的特点包括:
- 机器编码:数据以特定计算机架构的机器语言编码,直接被CPU执行。
- 不可读性:由于数据以二进制形式存储,因此无法直接用文本编辑器查看和编辑。
- 高效:二进制数据通常比文本表示更加紧凑,可以节省存储空间和处理时间。
3.2数据文件
数据文件是一种包含数据的文件,这些数据通常是用户或应用程序用于存储信息的,如配置设置、用户数据、统计信息等。数据文件可以是文本格式,也可以是二进制格式。
数据文件的特点包括:
- 可读性:文本格式的数据文件可以直接用文本编辑器打开和编辑。
- 结构化:数据文件通常具有一定的结构,如CSV、JSON、XML等,便于程序解析和处理。
- 便携性:文本格式的数据文件更容易在不同的系统和应用程序之间交换。
3.3二进制文件 vs 数据文件
尽管二进制文件和数据文件都是用于存储数据的,但它们的用途和操作方式有所不同:
- 二进制文件主要用于存储程序指令和多媒体数据,它们通常需要专门的软件或程序来解释和执行。
- 数据文件主要用于存储配置信息、用户生成的内容和其他程序使用的数据。它们可以被文本编辑器读取,也可以被特定程序解析和处理。
在实际应用中,开发者会根据需要选择使用二进制文件还是数据文件。例如,对于需要快速访问和处理的复杂数据结构,二进制文件可能是更好的选择,因为它们可以直接在内存中表示,而不需要额外的解析步骤。而对于需要跨平台共享和编辑的数据,文本格式的数据文件可能更合适。
4.文件的打开和关闭
4.1流和标准流
4.1.1流(Stream)
我们的程序的数据需要输出到各种外部设备,也需要从外部设备获取,不同的外部设备的输入输出操作各不相同,为了方便程序员对各种设备进行方便的操作,流这个概念被抽象出来。
在计算机科学中,流(Stream)是一个抽象概念,用于描述数据的流动。它类似于水流或电流,数据在流中从源头传输到目的地。流可以是从输入设备到计算机的输入流,也可以是从计算机到输出设备的输出流。流的概念在编程语言中非常重要,因为它提供了一种统一的方式来处理不同类型的输入和输出,如文件、网络连接和设备。
4.1.2标准流(Standard Streams)
标准流是一组在大多数操作系统环境中预定义的输入/输出流,它们分别是:
-
标准输入(Standard Input,stdin):通常指的是键盘输入,程序可以从这里读取用户输入的数据。
-
标准输出(Standard Output,stdout):通常指的是显示器输出,程序可以将信息输出到这里显示给用户。
-
标准错误(Standard Error,stderr):也是显示器输出,但用于输出错误信息。与标准输出分开的好处是,错误信息不会与正常输出混合,便于用户识别和调试。
这些标准流在命令行界面(CLI)中尤为重要,因为它们允许用户与程序交互,并且程序可以将结果反馈给用户。在许多编程语言中,包括C语言,标准流是通过标准库中的文件指针访问的,例如 stdin
, stdout
, stderr
。
在C语言中,标准流是通过预定义的文件指针来访问的,它们分别对应于文件描述符0、1和2。例如,printf
函数会将数据写入标准输出(stdout),而 scanf
函数会从标准输入(stdin)读取数据。
标准流的一个关键特性是它们可以被重定向。在命令行中,用户可以将标准输入重定向到一个文件,将标准输出或标准错误重定向到另一个文件,从而改变程序的数据来源和输出目标。这种功能使得命令行工具和网络实用程序变得非常强大和灵活。
4.2文件指针
在C语言中,文件指针是一个指针变量,它用于访问与文件相关的信息,并且用于对文件进行读取、写入和其他操作。文件指针通常指向一个FILE结构体,该结构体包含了文件的状态信息和文件操作函数所需的上下文。
FILE结构体由C语言的标准库定义,它的具体实现细节依赖于操作系统和编译器。这个结构体包含了如文件描述符、当前读写位置、错误标志、缓冲区等信息。
4.3文件的打开和关闭
文件在读写之前应该先打开文件,在使用结束之后应该关闭文件。
在编写程序的时候,在打开文件的同时,都会返回一个FILE*的指针变量指向该文件,也相当于建立了指针和文件的关系。
ANSIC规定使用fopen打开,fclose来关闭文件。
在C语言中,使用`fopen`函数打开文件时,可以指定不同的模式(mode)来控制文件的访问权限和操作。以下是一些常用的文件打开模式:
1. **"r"**:以只读方式打开文件,文件指针位于文件的开头。如果文件不存在,`fopen`会返回NULL。
2. **"w"**:以写入方式打开文件,如果文件已存在,则将其截断为0长度;如果文件不存在,则创建新文件。文件指针位于文件的开头。
3. **"a"**:以追加方式打开文件,如果文件不存在,则创建新文件。文件指针位于文件的末尾,写入的数据会被追加到文件的末尾。
4. **"r+"**:以读写方式打开文件,文件指针位于文件的开头。如果文件不存在,`fopen`会返回NULL。
5. **"w+"**:以读写方式打开文件,如果文件已存在,则将其截断为0长度;如果文件不存在,则创建新文件。文件指针位于文件的开头。
6. **"a+"**:以读写方式打开文件,如果文件不存在,则创建新文件。文件指针位于文件的末尾,写入的数据会被追加到文件的末尾,但读取操作可以从文件的开头开始。
7. **"rb"**、**"wb"**、**"ab"**、**"rb+"**、**"wb+"**、**"ab+"**:与上述模式相同,但是用于二进制文件。在大多数现代操作系统和编译器中,文本模式和二进制模式没有区别,但是在某些旧的系统上,它们可能会对换行符的处理有所不同。
8. **"x"**:与"`w`"或"`w+`"类似,但如果文件已存在,则`fopen`会失败并返回NULL。这可以用于避免意外覆盖现有文件。
9. **"bx"**、**"xb"**:与"`x`"模式结合使用,用于二进制文件。
10. **"cx"**、**"xc"**:与"`a`"或"`a+`"类似,但如果文件不存在,则`fopen`会失败。这可以用于确保只追加到已存在的文件。
11. **"tx"**、**"xt"**:与"`x`"模式结合使用,用于文本文件。
请注意,不是所有的编译器和操作系统都支持上述所有模式,特别是在不同的平台上,对文件模式和行为的支持可能会有所不同。因此,在使用这些模式时,最好参考你所使用的编译器和操作系统的文档。
实例代码: