文章目录
前言
本篇文章介绍c语言的文件读写操作。
一、文件基础
1.1 文件的分类
在c语言中,从文件的功能角度来看,文件可分为以下两类
- 程序文件
程序文件包含源文件(.c)、目标文件(.obj)、可执行文件(.exe) - 数据文件
数据文件的内容是供程序运行时读/写(输入/输出)的数据;
数据文件包含文本文件和二进制文件
1.2 文件路径和文件名
文件路径分为两类
- 相对路径
- 绝对路径
文件名包含3部分:文件路径(E:\cproject\advancedC)+文件名称(data)+文件后缀名(.txt)
E:\cproject\advancedC\data.txt
文件名作为文件的唯一标识,以便系统识别和使用。
二、文件的打开和关闭
2.1 文件指针
在缓冲文件系统中,每个被使用的文件 都在内存中开辟一个相应的文件信息区,用来存放文件的相关信息(比如文件的名称,文件状态等)。通过定义一个结构体变量存储这些信息。这个结构体通过类型重名,命名为FILE。
每当打开一个文件时,操作系统根据文件的情况自动创建一个FILE类型的结构体变量,并填充结构中的信息。
一般通过一个FILE*类型的指针去维护文件信息。
FILE* pf; //文件指针变量
定义一个文件指针变量pf,pf可以指向某个文件的文件信息区。通过文件信息区中的信息能够访问pf的文件,即通过文件指针变量能够找到与其关联的文件。
2.2 文件的打开和关闭
文件在读写之前应该先打开文件,在使用结束之后应该关闭文件。
在编写程序的时候,在成功打开文件后,都会返回一个FILE*的指针变量并指向该文件,也相当于建立了指针和文件的关系。
ANSIC规定使用以下两个函数打开文件和关闭文件
//打开文件
FILE * fopen ( const char * filename, const char * mode );
//关闭文件
int fclose ( FILE * stream );
fopen()参数说明
- filename:要打开的文件名(包含路径)
- mode:文件的打开模式
文件打开模式 | 含义 | 如果文件不存在 |
"r" | 以只读的方式打开一个已存在的文本文件 | 出错 |
"w" | 以只写的方式打开一个文本文件 | 建立一个新文件 |
"a" | 向文本文件末尾追加数据 | 建立一个新文件 |
"rb" | 以只读的方式打开一个二进制文件 | 出错 |
"wb" | 以只写的方式打开一个二进制文件 | 建立一个新文件 |
"ab" | 向二进制文件末尾追加数据 | 建立一个新文件 |
"r+" | 以读写的方式打开一个文本文件 | 出错 |
"w+" | 以读写的方式打开一个文本文件 | 建立一个新文件 |
"a+" | 以读写的方式打开一个文本文件,在文件末尾进行读写 | 建立一个新文件 |
"rb+" | 以读写的方式打开一个二进制文件 | 出错 |
"wb+" | 以读写的方式打开一个二进制文件 | 建立一个新文件 |
"ab+" | 以读写的方式打开一个二进制文件,在文件末尾进行读写 | 建立一个新文件 |
注意: 在使用文件之前,要对打开文件的进行判断是否打开成功
//1.打开文件
FILE* pf = fopen("data.txt", "w");
//判断
if (NULL == pf)
{
//利用perror()打印错误信息
perror("fopen");
return 1;
}
//2. 使用文件
//....
//3. 关闭文件
fclose(pf);
pf = NULL;
三、文件顺序读写
文件的读写操作分三步
第一步:打开文件
第二步:读/写文件
第三步:关闭文件
以下是c语言提供的库函数对文件读/写操作的支持
功能 | 函数名 | 操作对象 |
字符输入函数 | fgetc() | 所有输入流 |
字符输出函数 | fputc() | 所有输出流 |
字符串输入函数 | fgets() | 所有输入流 |
字符串输出函数 | fputs() | 所有输出流 |
格式化输入函数 | fscanf() | 所有输入流 |
格式化输出函数 | fprintf() | 所有输出流 |
二进制输入 | fread() | 文件 |
二进制输出 | fwrite() | 文件 |
任何一个c程序,只要运行起来就会默认打开三个流
- stdin -> 标出输入流(键盘)
- stdout->标准输出流(屏幕)
- stderr->标准错误流(屏幕)
因此,在c程序中
可以直接使用scanf()直接接收键盘数据(stdin);
printf()直接将信息输出到屏幕(stdout);
perror()直接将错误信息输出到屏幕(stderr)。
3.1 fputc()和fgetc()
将一个字符写入文件
#include<stdio.h>
//fputc()向文件写入一个字符
int main