文件分类:
文本文件:记录的是字符串的二进制
二进制文件:直接把数据补码记录到文件中
磁盘只能存储二进制数据。
文件文件中存储的是ASCII码的二进制,先把数据转换成字符中,
再写入到文件中,可以直接被文本编辑器打开。
二进制文件中存储的数据的二进制,直接把数据的二进制存储到文件中,
无法直接通过文件编辑器查看。
文件I/O函数:
FILE *fopen(const char *path, const char *mode);
功能:打开或创建文件
path:文件的路径(可以是相对路径,也可以是绝对路径)
mode:文件的打开方式
"w" 以只写权限打开文件,如果文件不存在则创建,存在则清空文件的内容。
"w+" 在"w"的基础上增加读取权限。
"r" 以只读权限打开文件,如果文件不存在则打开失败。
"r+" 在"r"的基础上增加写取权限
"a" 以只写权限打开文件,如果文件不存在则创建,存在保留原内存,新写入的数据会追加到文件末尾。
"a+" 在"w"的基础上增加读取权限。
"b" 不能单独使用,而是与"wra"配合使用,表示打开的是二进制文件,对于Linux系统而说没什么用。
在Windows系统下:
"b"表示操作的是二进制文件 \n 直接写入 \n。
不加"b"表示操作的是文本文件,\n 会被写入 \n\r。
返回值:返回的是一个结构体指针,不需要操作结构的成员,只需要反它当作一个令牌即可,用来区别所操作的文件,如果文件打开失败返回值为NULL。
int fprintf(FILE *stream, const char *format,…);
功能:以文本形式写入数据
stream:文件指针,fopen函数的返回值
format:占位符
...:变量名
返回值:成功写入字节的个数
int fscanf(FILE *stream, const char *format, …);
功能:从文件中以文本形式读取数据到变量
stream:文件指针,fopen函数的返回值
format:占位符
...:变量的地址
返回值:成功读取到的变量的个数
size_t fwrite(const void *ptr, size_t size, size_t nmemb,FILE *stream);
功能:把数据的二进制写入到文件中
ptr:要写入的数据的首地址
size:写入的字节数
nmemb:写入的次数
stream:文件指针,fopen的返回值
返回值:成功写入的次数
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
功能:从文件中以二进制的形式读取数据到内存中
ptr:读取数据后的存储位置
size:每次读取的字节数
nmemb:读取的次数
stream:文件指针,fopen的返回值
返回值:成功写入的次数
fread(&stu,1,sizeof(stu),frp);
文件位置指针:
每一个打开文件系统都会用一个变量记录文件的读写的位置。
使用w、r打开的文件位置指针都在文件的开头,而使用a打开的文件,位置指针都在末尾。
位置指针会随着数据的读写而变化。
int fseek(FILE *stream, long offset, int whence);
功能:设置文件的位置指针,位置指针会设置到 基础位置+偏移值
stream:文件指针
offset:偏移值
whence:基础位置
SEEK_SET 文件开头
SEEK_CUR 当前位置
SEEK_END 文件末尾
返回值:调用后的文件位置指针(整数,字节数)。
long ftell(FILE *stream);
功能:获取文件的位置指针,位置指针当前所在的字节数
void rewind(FILE *stream);
功能:把文件的位置指针,调整到开头。
int fclose(FILE *fp);
功能:关闭文件
当数据写入后并没有立即同步到磁盘中,而存储在缓冲区中,只有满足一些条件时才会从缓冲区中写入到磁盘中。
1、从输出调整到输入。
2、缓冲区满4k
3、文件关闭
4、程序结束
5、手动刷新 int fflush(FILE *stream);
默认打开的文件指针:
stdin 标准输入
stdout 标准输出
stderr 标准错误
结构体序列化和反序列化:
体序列化:结构变量转换成字符串
int sprintf(char *str, const char *format, …);
功能:把一些变量按照格式合并成一个字符串
format:占位符
...:变量名
返回值:合并后的字符串长度
为什么要进行序列化:
1、为了方便数据库操作
2、方便网络传输
3、文件读写
反序列化:字符串转换成结构体
int sscanf(const char *str, const char *format, …)
功能:从字符串中读取数据到变量
str:待读取数据的字符串
format:占位符
...:变量地址
返回值:成功读取的变量数
main函数的参数:
main的参数可以让程序从命令行执行时附加一些字符串,
如:执行系统命令时附加的参数就是以参数使用实现的。
ls -l
touch filename
int main(int agrc,char* argv[])
{
agrc:字符串的数量
argv:存储字符串的指针数组
}
int access(const char *pathname, int mode);
功能:检查文件的权限
pathname:文件路径
mode:
F_OK 检查文件是否存在
R_OK 检查文件是否有读权限
W_OK 检查文件是否有写权限
X_OK 检查文件是否有执行权限
返回值:成功返回0,失败返回-1