为什么要使用文件?
要将数据持久化保存
文件
按文件功能分类,文件分为两种:
程序文件 和 数据文件
程序文件
后缀名为①.c ②.obj ③.exe
数据文件
文件的内容不一定是程序,而是程序运行读写的数据
如:程序运行时要从中读取数据文件内容/输出内容文件
根据数据的组织形式,数据文件被称为文本文件或二进制文件
文本文件
数据在内存中以二进制形式储存,不加转换输出到外存
二进制文件
数据在外存以ASCII码形式存储,在存储前转换(以ASCII字符的形式存储的文件)
一个数据在内存中怎么储存的呢?
在下面👇 “文件的打开和关闭” 讲到
文件名
文件名包含三部分:
文件路径 + 文件名主干 + 文件后缀
⽂件的打开和关闭
流和标准流
一图 KO 流 概念
标准流
C语⾔程序在启动的时候,默认打开了3个流:
① stdin-标准输入流,在大多数的环境中从键盘输⼊,
scanf函数就是从标准输入流中读取数据。
②stdout-标准输出流,大多数的环境中输出至显示器界面,
printf函数就是将信息输出到标准输出流中。
③stderr-标准错误流,大多数环境中输出到显示器界面。
文件指针
运行程序时,默认打开了这三个流,我们使⽤scanf、printf等函数就可以直接进行输入输出操作的。
stdin、stdout、stderr 三个流的类型是: C语⾔中,就是通过 FILE* ,通常称为文件指针。
FILE* 的⽂件指针来维护流的各种操作的。
该结构体类型是由系统声明的,取名FILE.
通过文件指针变量能够间接找到与它关联的文件
FILE* pf;//文件指针变量
文件的打开和关闭
文件在读写之前打开文件,在使用结束后关闭文件
mode打开方式
文件的打开模式
文件使用方式 | 含义 | 如果指定文件不存在 |
"r"(只读) | 为了输入数据,打开一个已经存在的文本文件 | 出错 |
"w"(只写) | 为了输出数据,打开一个文本文件 | 建立一个新的文件 |
"a"(追加) | 向文本文件尾添加数据 | 建立一个新的文件 |
函数使用
#include<stdio.h> int main() { //文件指针变量读写文件 // 当前文件位置 //FILE* pf = fopen("data.txt", "w"); //当前文件位置 FILE* pf = fopen("./data.txt", "w"); //当前文件的上一级位置 //FILE* pf = fopen("./../data.txt", "w"); if (pf == NULL) { perror("fopen"); return 1; } //关闭文件 fclose(pf); pf = NULL; return 0; }
文件的顺序读写
文件顺序读写函数
函数名 | 功能 | 适用于 |
fgetc | 字符输入函数 | 所有输入流 |
fputc | 字符输出函数 | 所有输出流 |
fgets | 文本行输入函数 | 所有输入流 |
fputs | 文本行输出函数 | 所有输出流 |
fscanf | 格式化输入函数 | 所有输入流 |
fprintf | 格式化输入函数 | 所有输出流 |
fread | 二进制输入 | 文件 |
fwrite | 二进制输出 | 文件 |
函数原型
回到上面的 “二进制文本” 提到的问题
一个数据在内存中怎么储存的呢?
int main() { int a = 100; //文件指针变量打开文件 FILE* pf = fopen("Data.txt", "wb"); if (pf == NULL) { perror("fopen"); return 1; } //以二进制方式写入文件 fwrite(&a, 4, 1, pf); //关闭文件 fclose(pf); pf = NULL; return 0; }
内存中以二进制显示:
用的比较多的是fputc
fputc
函数使用
int main() { //文件指针打开文件 FILE* pf = fopen("Data.txt", "w"); if (pf == NULL) { perror("fopen"); return 1; } //输入数据读写文件:26个字母 //int i = 0; //for (i = 0; i < 26; i++) //{ // fputc('a' + i, pf); // fputc('\n', pf); //} //控制台输出stdout int i = 0; for (i = 0; i < 26; i++) { fputc('a' + i, stdout); fputc('\n', stdout); } //关闭文件 fclose(pf); pf = NULL; return 0; }
文件的随机读写
fseek
函数介绍
函数使用
int main() { //文件指针打开文件 FILE* pf = fopen("Data.txt", "r"); if (pf == NULL) { perror("fopen"); return 1; } //读写文件 int ch = fgetc(pf); printf("%c\n", ch); ch = fgetc(pf); printf("%c\n", ch); ch = fgetc(pf); printf("%c\n", ch); fseek(pf, 3, SEEK_SET); ch = fgetc(pf); printf("%c\n", ch); //关闭文件 fclose(pf); pf = NULL; return 0; }
控制台显示
ftell
函数介绍
int main() { //文件指针打开文件 FILE* pf = fopen("Data.txt", "r"); if (pf == NULL) { perror("fopen"); return 1; } //读写文件 int ch = fgetc(pf); printf("%c\n", ch); ch = fgetc(pf); printf("%c\n", ch); ch = fgetc(pf); printf("%c\n", ch); int n = ftell(pf); printf("%d\n", n); //关闭文件 fclose(pf); pf = NULL; return 0; }
控制台显示
rewind
函数介绍
作用:返回文件起始位置(文件开头)
函数使用
int main() { //文件指针打开文件 FILE* pf = fopen("Data.txt", "r"); if (pf == NULL) { perror("fopen"); return 1; } //读写文件 int ch = fgetc(pf); printf("%c\n", ch); ch = fgetc(pf); printf("%c\n", ch); rewind(pf); ch = fgetc(pf); printf("%c\n", ch); //关闭文件 fclose(pf); pf = NULL; return 0; }
控制台输出