在课上学习了对文件的编辑
可以实现在程序中对数据的保存
在文件中对文件的编辑,以及移动位置
文件分类:
int num = 2048;
二进制文件:把数据的补码直接写入文件,这种文件叫二进制文件。
优点:读取和写入不需要转换,速度快。数据安全性高
缺点:不能使用文本编辑器打开,无法阅读。
文本文件:把数据转换为字符串写入文件,这种文件叫文本文件,能被文本编辑器打开,人类能看得懂
优点:能被文本编辑器打开,人类能看得懂,能够看出数据是否出错。
缺点:读写时需要转换,读写速度慢,数据有被修改的风险。
总结:二进制文件的大小是确定的,文本文件会根据数据的内容而变化,大小不确定。
打开文件:
FILE *fopen(const char *path,const char *mode);
功能:打开文件
path:文件的路径
mode:文件的打开方式
返回值:文件结构指针,是后续操作文件的凭证,失败则返回NULL。
文件的打开方式
注意:如果要操作二进制文件,则在以模式的基础上增加b
int fclose(FILE *stream);
功能:关闭文件
返回值:成功返回0,失败返回-1
注意:不能重复关闭,否则会出现double free错误,为了防止出现野指针,文件关闭后最后把文件指针赋值为NULL,及时关闭文件可以把
缓冲区中的数据写入到文件中。
文本文件的读写:
int fprintf(FILE *stream,const char *format,.....);
功能:把若干个变量写入到指定文件中
stream:要写入的文件
format:占位符+转义字符+提示信息
...:若干个变量
返回值:成功写入字符的数量
int fscanf(FILE *stream,const char *format,...);
功能:从文件中读取数据到变量中
stream:要读取的文件
format:占位符
...:若干变量的地址
返回值:成功读取的变量个数
二进制文件的读写:
注意:以二进制格式读写文件时,最好加上mode最好包含b
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:数组的容量
返回值:成功读取的次数
文件位置指针:
纪录着读写文件时的位置,读取数据时,从文件位置指针处开始读取,写入数据时也会写入到文件位置指针所指向的位置,
并且它会随着读写操作自动移动
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就是文件指针最终设置的位置
int remove(const char *path);
功能:删除文件
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
功能:生成一个与当前文件系统不重名的文件名
程序运行时,先把数据从文件中加载内存,程序在运行期间只针对增减
然后再把内存放入文件。
文件移动
#include
#include
#include
int filemove(const char* dest_path,const char* src_path)
{
assert(NULL!=dest_path && NULL!=src_path);
if(0 == strcmp(dest_path,src_path))
{
return 0;
}
FILE* rtp = fopen(src_path,"r");
if(NULL == rtp)
{
printf("%s 文件不存在",src_path);
return -1;
}
FILE* wfp = fopen(dest_path,"w");
if(NULL == wfp)
{
printf("%s 文件不存在",dest_path);
return -1;
}
char buf[4096];
int ret = 0;
while(ret = fread(buf,1,sizeof(buf),rtp))
{
fwrite(buf,1,ret,wfp);
}
fclose(rtp);
fclose(wfp);
return remove(src_path);
}
int main(int argc,const char* argv[])
{
printf("%dn",filemove("fileshort.c","1.c"));
return 0;
}
文件拷贝
#define filemax 100
void filecopy(FILE* dest_path,FILE* src_path)
{
assert(NULL != dest_path && NULL != src_path);
size_t a = 0;
void *p1 = malloc(sizeof(dest_path)*filemax);
a = fread(p1,sizeof(dest_path),filemax,dest_path);
fwrite(p1,sizeof(dest_path),a,src_path);
fclose(dest_path);
fclose(src_path);
dest_path = NULL;
src_path = NULL;
free(p1);
p1 = NULL;
}
int main(int argc,const char* argv[])
{
FILE *dest_path = fopen("dest.dat","r");
FILE *src_path = fopen("src.dat","w");
filecopy(dest_path,src_path);
return 0;
}
学自大师兄



