文件的分类:
文本文件: 存储的是ASCII码的二进制(人能看懂)
二进制文件: 存储的是数据的补码
文件IO:
FILE* fp = fopen(const char* path,const char* mode);
功能: 打开或创建文件
path: 文件的路径
mode: 打开的模式
r 以只读权限打开文件,如果文件不存在则打开失败
r+ 在r的基础上增加写权限
w 以只写权限打开文件,如果文件不存在则新建,如果文件存在就清空
w+ 在w的基础上增加读权健
a 以只写权限打开文件,如果文件不存在则新建,如果文件存在则不清空,新写入的数据在文件的末尾
a+ 在a的基础上增加读权限
注意: 以上方式以文本形式操作文件,在它们基础上加b表示以二进制方式操作文件
返回值: 结构指针,也称为文件指针,不需要关心它的成员,只需要知道它是操作文件的凭证,如果值是NULL表示文件操作失败
int fclose(FILE* fp);
功能: 关闭文件
二进制方式读写文件:
fwrite
size_t fwrite(const void* ptr,size_t size,size_t nmemb,FILE* stream);
功能: 把内存中的数据写入到文件中
ptr: 内存首地址
size: 一次写入多少个字节
nmemb: 写入多少次
stream: 文件指针,fopen的返回值
返回值: 成功写入的次数
练习1: 定义一个教师结构体变量并初始化,以二进制形式写入文件中(以二进制方式写)
fread
size_t fread(void* ptr,size_t size,size_t nmemb,FILE* stream);
功能: 从文件中读取数据到内存中
ptr: 存储从文件中读取的数据内存首地址
size: 一次读取的字节
nmemb: 读取多少次
stream: 文件指针,fopen的返回值
返回值: 成功读取到的次数
练习2: 从文件中读取数据到一个教师结构体变量中并显示(以二进制方式读)
文本方式读写文件:
int fprintf(FILE* stream,const char* format,...);
功能: 以文本形式写入数据到文件中
stream: 要写入的文件
format: 占位符和提示信息
...: 变量列表
返回值: 成功写入的字节数
int fscanf(FILE* stream,const char* format,...);
功能: 从文件中读取数据到变量中
stream: 要读取的文件指针
format: 占位符
...: 变量地址列表
返回值: 成功读取到的变量个数
练习3: 定义一个教师结构体变量并初始化,以文本形式写入到文件中
练习4: 从文件中以文本形式读取到教师结构体中并显示
文件的随机读写:
文件的位置指针:
每个打开的文件都有一个指针记录着操作的位置,它会随着读写函数的执行而移动,以r、r+、w、w+模式打开文件位置指针在开头,以a、a+打开文件位置指针在文件末尾
如果想要随机读写文件的任意位置的数据,只需要手动设置文件的位置指针即可
int fseek(FILE* stream,long offset,int whence);
功能: 设置文件的位置指针
stream: 要设置的文件
offset: 偏移值
whence: 基础位置
SEEK_SET 文件开头
SEEK_CUR 当前位置
SEEK_END 文件末尾
返回值: 成功返回0、失败返回-1
void rewind(FILE* stream);
功能: 把文件位置指针设置到开头
long ftell(FILE* stream);
功能: 获取文件位置指针的位置
返回值: 第几个字节
int feof(FILE* stream);
功能: 检查文件位置指针是否到达末尾
返回值: 返回0说明到达文件末尾
char* fgets(char* s,int size,FILE* stream);
stdout: 从文件中读取一行字符串
int fputs(const char*s,FILE* stream);
功能: 写入一个字符串到文件中,自动在末尾添加\n
返回值: 成功写入的字符个数
int remove(const char* pathname);
功能: 删除文件
返回值: 成功返回0,失败返回-1
int rename(const char* oldpath,const char* newpatch);
功能: 重命名文件
返回值: 成功返回0,失败返回-1
main函数的参数:
是为了获取命令行附加的参数
argc: 代表参数的个数
argv: 每个字符串参数的首地址
注意: ./a.out一定是第一个参数
练习5: 实现cp命令的功能
cp src dest
1、以r打开src文件,以w创建dest文件
2、边读边写,知道文件读到末尾结束
3、关闭文件