文件类型
从编程角度我们把文件分为两大类,为文本文件和二进制文件
二进制文件:存储的是数据的补码,无法用文本文件直接打开,好处是读取文件后就可以直接使用
文本文件:把数据以字符形式存储到文件中,可以被直接打开,检查数据是否正确,但读写都需要进行数据转换
操作函数
打开/关闭
打开文件:
FILE *fopen(const char *path, const char *mode)
功能:打开、创建文件
path: 文件的路径
mode: 打开方式
"r" 以只读方式打开,不存在则失败
"r+" 在r的基础上增加写权限
"w" 以只写方式打开文件, 不存在则创建, 存在则清空文件内容
"w+" 在w基础上增加读权限
"a" 以只写方式打开文件, 不存在则创建 存在则追加内容到文件末尾
"a+" 在a的基础上增加读权限
返回值:
FILE结构指针,该结构中记录着被打开文件的相关数据,它是接下来操作文件的凭证
打开失败返回NULL
注意:如果文件本身没有相关权限 打开失败
ls -l filename 查看文件权限
r读 w写 x执行
int fclose (FILE* stream)
关闭文件
文本文件的读写
int fprintf(FILE *stream, const char *format, ...)
功能:以文本格式写入数据到文件
stream:要写入的文件,fopen的返回值
format: 格式
... : 要写的变量
返回值:成功写入字节数
FILE* file1=fopen("stu.txt","w");//打开文件
if (NULL == file1) //判断是否成功打开
{
printf("stu文件打开失败!");
return ;
}
for(int i=0;i<count_stu;i++)
{
fprintf(file1,"姓名:%s 性别:%s 学号:%d 语文:%f 数学:%f 英语:%f 密码:%s lock:%c\n", //文件写入字符加格式
((s+i)->name),((s+i)->sex),((s+i)->id),((s+i)->Chinese),((s+i)->Math),((s+i)->English),((s+i)->key),((s+i)->lock)); //对应地址的数据(与格式一一对应)
}
fclose(file1);
结果:
int fscanf(FILE *stream, const char *format,...)
stream: 要读取的文件,fopen的返回值
format:占位符
... 存储数据变量的地址
返回值:成功读取的变量个数
例
FILE* fp1= fopen("stu.txt", "r");//在校学生
if (NULL == fp1)//判断文件是否成功打开
{
printf("stu文件打开失败!");
return ;
}
while (0<fscanf(fp1, "姓名:%s 性别:%s 学号:%d 语文:%f 数学:%f 英语:%f 密码:%s lock:%c\n", //文件读取格式
s[count_stu].name,(s[count_stu].sex),&(s[count_stu].id),&(s[count_stu].Chinese), &(s[count_stu].Math), &(s[count_stu].English),(s[count_stu].key),&(s[count_stu].lock))) //文件读取后存储位置(结构体s)
count_stu++;
fclose(fp1);
结果:
通过printf打印存储变量可知成功读取
char *fgets(char *s,int size, FILE *name)
功能 从文件中读取一行字符串,且可以限制字符串长度
fgets(str,size,stdin); //从终端中读取输入size-1个字符到char类型数组str中,末尾为'\n'
随机读写:
,每个打开文件都有一个指针记录着该文件读写到哪里,被称为文件的位置指针,会随读写移动
“r” “r+” 方式打开的文件,指针指向开头
“a” “a+” 方式打开的文件,指针指向末尾
int fseek (FILE *stream, long offset, int whence)
stream 要设置的位置
offset 偏移值
whence 基础位置
SEEK_SET 开头
SEEK_CUR 当前
SEEK_END 末尾
返回值 成功为0 失败为-1
fseek(file,0,SEEK_SET)
void rewind(FILE *stream)
功能:把文件位置指针跳到开头
long ftell(FILE *stream)
功能:获取文件指针所指向的字节数
二进制文件的读写
size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE* stream)
功能:把内存的数据拷贝到文件中
ptr:要写入数据的内存首地址
size: 数据的每个元素字节数 不知道类型时写1
nmemb:元素的个数
stream:文件指针
返回值:成功写入的元素个数, 正常情况下应该是nmemb参数
size_t fread(void *ptr, size_t size, size_t nmemb, FILE* stream)
ptr:存储数据的内存首地址
size:数据的每个元素字节数
nmemb:要读取的元素的个数
stream:文件指针
int remove(const char pathname)
功能 删除文件
int rename(const char *oldpath, const char *newpath)
功能 重命名文件
int access(const char *pathname, int mode)
功能:测试文件权限
mode: 要测试的权限
F_OK 文件是否存在
W_OK 文件是否有写权限
R_OK 文件是否有读权限
X_OK 文件是否有执行权限
返回值 如果测试权限存在,返回0,否则-1