想要持久化的保存程序就需要使用文件,而文件一般分为两种
程序文件 与 数据文件
程序文件: 可执行程序
即程序运行需要从中读取数据的文件或输出内容的文件
数据文件: 数据库的文件
文件名的命名方式:
文件路径+文件名主干+文件后缀
文本文件与二进制文的区分:
以ascll码的形式存储的文件就是文本文件
存储时直接以二进制方式直接存储就是二进制文件
文件的打开与关闭
流 : c程序针对文件画面键盘的数据都是通过流来操作的
一般我们想要向流里写数据,读取数据需要打开流
标准流:
stdin stdout stderr三个都是FILE*类型的文件指针
打开文件:
FILE* pf=fopen(const char* filename, const char* mode )
r(只读) 为了输入数据 打开一个已经存在的文本文件 指定文件不存在时出错
w(只写) 为了输出数据, 打开一个文本文件(会将原本存在的内容清空) 指定文件不存在时创建一个新的文件
a(追加) 向文本文件尾添加数据 指定文件不存在时创建一个新的文件
rb(只读) 为了输入数据 打开一个二进制文件 指定文件不存在时出错
wb(只写) 为了输出数据,打开一个二进制文件 指定文件不存在时创建一个新的文件
ab(追加) 向二进制文件尾添加数据 指定文件不存在时创建一个新的文件
关闭文件:
fclose(pf);
pf=NULL;//防止pf成为野指针
对文件内容的操作:
顺序读写
fgetc(FILE* pf): 字符输入 读一个文件里的字符
//如果成功读取字符的话,返回的是字符的ascll值
//如果读取失败或文件末尾时 返回EOF(-1) 为了兼容EOF所以返回值是int型
fputc(int(要写入的字符) , FILE* pf) 字符输出 写字符到一个流里
fputs(const char* str, FILE* pf) 把str指向的字符串写到pf中
fgets(char* str, int num, FILE* pf) 最多读num-1个要给最后的\0留一个位置
从pf中读num个字符放到str中 不会换行读取 如果长度允许会放入\n
fprintf比printf多一个FILE* pf参数
fprintf(pf, " ", a,b,c…)以文本的形式写到pf文档中
fscanf比scanf多一个参数FILE* pf
fscanf(pf, " ",&a,&b…)读取文件放入变量中
scanf–从标准输入流上读取格式化大数据
fscanf-从指定的输入流上读取格式化的数据
printf–把数据以格式化的形式打印标准的输出流上
fprintf–把数据以格式化的形式打印指定的输出流上
sprintf–把格式化数据转化成字符串
fwrite(const void* ptr(数组的起始地址), size_t size(数组元素大小),size_t count(写入个数), FILE* pf)
将count个内容从数组写入pf中以二进制的形式读取
fread与fwrite同理
文件随机读写
fseek—根据文件指针的位置和偏移量来定位文件指针
fseek(FILE* pf, long int offeset(偏移量), int origin(起始位置) )
SEEK_SET文件起始位置
SEEK_CUR当前位置
SEEK_END末尾位置
ftell返回文件指针相对于起始位置的偏移量
ftell(FILE* pf)
rewind让文件指针位置回到起始位置
文件结束的判定
不能用feof的返回值直接判定文件读取是否结束
feof是判断是否到文件末尾
ferror是判断文件是否遇到错误
在进行判断时两者都要使用