C-文件操作
文件分类
-
二进制文件:把数据的补码直接写入文件
优点:读写速度快、安全性高
缺点:无法查看
-
文本文件
优点:数据我们能看懂,方便查看是否出错
缺点:读写速度慢、有被他人修改的风险
打开、关闭文件
FILE *fopen(const char *path, const char *mode);
功能:打开文件
path:文件的路径
mode:文件的打开模式
返回值:文件结构指针,是后续操作文件的凭证,失败则返回NULL。
int fclose(FILE *stream);
功能:关闭文件
返回值:成功返回0,失败返回-1。
注意:不能重复关闭,否则会出现double free错误,为了避免出现这种错误,在文件关闭及时把文件指针赋值为NULL,及时关闭文件可以把缓冲区中的数据写入到文件中。
文件的打开模式
"r" 以只读方式打开文本文件,如果文件不存在,或文件没有读权限则打开失败。
"r+" 在"r"的基础上增加了写权限。
"w" 以只写方式打开文本文件,如果文件不存在则创建,如果文件存在则清空文件的内容,如果文件存在但没有写权限,则打开失败。
"w+" 在"w"的基础上增加了读权限。
"a" 以只写方式打开文本文件,如果文件不存在则创建,如果文件存在则新写入的内容追加到文件末尾,如果文件存在但没有写权限,则打开失败。
"a+" 在"a"的基础上增加了读权限。
如果要操作二进制文件,则在以上模式的基础上增加b。
文本文件
int fprintf(FILE *stream, const char *format, ...);
功能:把若干个变量以文本格式写入到指定的文件中
stream:要写入的文件凭证,必须是fopen的返回值。
format:占位符+转义字符+提示信息
...:若干个变量
返回值:写入字符的数量
int fscanf(FILE *stream, const char *format, ...);
功能:从文件中读取数据
stream:要读取的文件
format:占位符
...:若干个变量的地址
返回值:成功读取的变量个数
二进制文件
size_t fwrite(const void *ptr, size_t size, size_t nmemb,FILE *stream);
功能:把一块内存当作数组,然后数组中的内容以二进制格式写入到文件中
ptr:数组首地址
size:数组元素的字节数
nmemb:数组的长度
stream:要写入的文件
返回值:实际写入的次数
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
功能:把二进制文件中的内容读取的数组中
ptr:要存储数据的数组首地址
size:数组元素的字节数
nmemb:数组的容量
返回值:成功读取的次数
注意:以二进制格式读写文件时,打开mode最好包含b。
int sprintf(char *str, const char *format, ...);
功能:把若干个变量转换成字符串输出到str数组中
int sscanf(const char *str, const char *format, ...);
功能:从字符串读取若干个变量
文件位置指针:
文件位置指针它指向文件中即将要读取的数据,以"r"、"r+“方式打开文件,文件位置指针指向文件的开头,以"a”、"a+"方式打开文件,文件位置指针指向文件的末尾。
读取数据时会从 文件位置指针指向 的地方开始读取,写入数据时也会写入到文件位置指针所指向的地址,并且它会随着读写操作自动移动。
注意:刚写完数据立即读取会失败,因为这时文件位置指针指向文件的末尾。
void rewind(FILE *stream);
功能:把文件的位置指针调整到文件的开头。
long ftell(FILE *stream);
功能:返回文件位置指针指向了文件中的第几个字节
int fseek(FILE *stream, long offset, int whence);
功能:设置文件的位置指针
stream:要设置的文件
offset:偏移值(正负整数)
whence:基础位置
SEEK_SET 文件开头
SEEK_CUR 当前位置
SEEK_END 文件末尾
whence+offset就是文件指针最终设置的位置。
返回值:成功返回0,失败返回-1。
文件管理:
int remove(const char *pathname);
功能:删除文件
int rename(const char *oldpath, const char *newpath);
功能:重命名文件
int truncate(const char *path, off_t length);
功能:把文件的内容设置为length字节数
char *tmpnam(char *name);
功能:生成一个与当前文件系统不重名的文件名。
int access(const char *pathname, int mode);
功能:检查文件的权限
mode:
R_OK 读权限
W_OK 写权限
X_OK 执行权限
F_OK 文件是否存在
返回值:
检查的权限如果存在则返回0,不存在则返回-1。