1.什么是文件

在 C 语言里,文件本质是存储在外部介质(硬盘、U 盘等)上的一组有序数据集合,操作系统会给它分配文件名,用来长期保存数据。

在程序设计中,我们常谈的文件有两种:程序文件、数据文件。

1.1 程序文件

存放代码、指令的文件,作用是告诉计算机要做什么,计算机读取里面的指令来运行、执行任务

例如:.c  .h  .exe  .com  等

1.2 数据文件

专门存放业务数据、运行结果、内容资料的文件,本身不能独立运行,只能被程序读取、修改、保存,作用是存储程序需要处理 / 产生的内容

数据文件又分:文本型数据文件二进制数据文件

1.2.1文本型数据文件

用字符编码存储,可读,比如:

.txt 纯文本、.csv表格数据、.log日志文件

1.2.2二进制数据文件

按数据原始二进制存储,体积小、读写快,比如:

.dat、图片 .jpg 、音频 .mp3

1.3文件名

一个文件对应一个唯一的文件名,所以同一路径下不可能出现同名文件

文件路径又分为绝对路径和相对路径:

1.3.1绝对路径和相对路径

1.3.1.1绝对路径

磁盘根目录开始,完整描述文件位置的路径,唯一、固定,不受当前程序所在位置影响。

1.3.1.2相对路径

不以根目录开头,以程序当前所在目录为参照来找文件,路径简短,依赖运行位置。


2.C语言的流

流的定义:在C语言中,“流”是一种用于输入和输出数据的抽象概念。它是一种数据的传输方式,可以将数据从一个地方传送到另一个地方。在C语言中,输入流和输出流是通过一组标准库函数来实现的,这些函数允许程序从键盘或文件中读取数据,或者将数据写入到屏幕或文件中

流可分为 标准流文件流

2.1标准流

标准输入流(stdin):用于读取输入数据,默认情况下是键盘输入。
标准输出流(stdout):用于向终端或命令行窗口输出数据。
标准错误流(stderr):用于输出错误信息。

2.2文件流

C语言中的文件流是一种用于在程序中读取和写入文件的流。通过文件流,可以在C程序中打开文件,从文件中读取数据或将数据写入文件中。这样可以有效地处理大量数据、持久性存储以及与文件系统的交互。


3.文件的打开和关闭

3.1文件指针

每个被使用的文件都在内存中开辟了一个相应的文件信息区,用来存放文件的相关信息(如文件的名字,文件状态及文件当前的位置等)。这些信息是保存在一个结构体变量中的。该结构体类型是由系统声明的,取名FILE

我们一般通过一个FILE的指针来维护这个FILE结构的变量

FILE * pf;//文件指针变量

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

3.2 文件的打开和关闭

在使用文件之前应该打开文件,使用完之后应该关闭文件

ANSIC规定用fopen来打开文件,用fclose来关闭文件

FILE * fopen ( const char * filename, const char * mode ); //打开文件
int fclose ( FILE * stream ); //关闭文件

打开方式如下:

文件使用方法                                         含义 如果指定文件不存在
"r"(只读) 为了输入数据,打开一个文本文件 出错
"w" (只写 为了输出数据,打开一个文件文本 建立一个新的文件
"a" (追加) 向文本文件尾部添加数据 建立一个新的文件
"rb" (只读) 为了输入数据,打开一个二进制文件 出错
"wb"(只写) 为了输出数据,打开一个二进制文件 建立一个新的文件
"ab"(追加) 向一个二进制文件尾添加数据 出错
"r+"(读写) 为了读和写,打开一个文本文件 出错
"w+"(读写) 为了读和写,建立一个新的文本文件 建立一个新的文件
"a+"(读写) 打开一个文件,在文件尾进行读写 建立一个新的文件
"rb+"(读写) 为了读和写,打开一个二进制文件 出错
"rw+"(读写) 为了读和写,建立一个新的二进制文件 建立一个新的文件
"ab+"(读写) 打开一个二进制文件,在文件尾进行读写 建立一个新的文件

3.3 文件的随机读写

功能 函数名 适用于
字符输入函数 fgetc 所有输入流
字符输出函数 fputc 所有输出流
文本输入函数 fgets 所有输入流
文本输出函数 fputs 所有输出流
格式化输入函数 fscanf 所有输入流
格式化输出函数 fprintf 所有输出流
二进制输入 fread 文件
二进制输出 fwirte 文件
fgetc函数
  • 返回文件指针当前指向的字符,然后文件指针向后移动一位
  • 如果文件指针位于文件末尾,那么就返回EOF,并为流设置 (feof) 的文件结束指示器
  • 如果文件读取错误,同样返回EOF,但改为设置其错误指示器 (ferror)


fputc函数
  • 将一个字符写入文件,然后文件指针向后移动一位
  • 如果写入成功,那么返回这个字符的ASCII值
  • 如果发生错误,则返回EOF

                        ​​​​​​​        


fgets函数


fscanf函数


fprintf函数


fread函数

可能有小伙伴不理解为什么是这个结果,我们一起来分析:
我们知道,fread是以二进制的形式读取文件中的信息,而文件中的1200是文本信息,每个字符对应的ASCII码为49,50,48,48,转换为二进制码:0011 0001 0011 0010 0011 0000 0011 0000,二进制再转换成十进制就是808464845


fwrite函数


fseek函数

根据文件指针的位置和偏移量来定位

int fseek ( FILE * stream, long int offset, int origin );

例如:

在test文件输出“I am good boy"使用fseek函数定位到第10个字符,然后将”girl"替换过去


ftell函数

返回文件指针相对于起始位置的偏移量

long int ftell ( FILE * stream );

例如:


4.文件读取结束的判断

牢记:在文件读取的过程中,不能使用feof函数的返回值直接来判断文件是否结束

 feof的作用是:当文件读取结束的时候,判断是读取结束的原因是否是:遇到文件末尾

文本文件读取是否结束:

        fgetc判断返回值是否为EOF
        fgets判断返回值是否为NULL
二进制文件读取是否结束:
        fread判断返回值是否小于实际要读的个数

Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐