C中的文件操作
- #include<stdio.h>
- 主要对象是磁盘;普通文件与目录文件;
文件路径
- 绝对路径(带根目录从最上级开始;有盘符)
C:\Windows\AppReadiness\test.txt
- 相对路径(当前路径)
.\test.txt
- .表示当前目录;
- …表示当前路径的上级目录;
文件名
- 所谓的文件后缀名若是修改,不会对文件内容或文件类型产生任何影响,只是告诉系统默认使用哪种程序来打开;
文件类型
- 文本文件
- 以ASC字符形式存储;存的是字符串;
- 二进制文件
- 就以二进制存储;直接打开就是乱码;
文件缓冲区
什么是缓冲区?
- 先存放数据在内存里,然后一次性放在外存里,这时内存扮演的角色就是缓冲区;减少开销很大的操作的次数,可以提升运行性能;
文件操作核心步骤
打开文件
fopen(const char*File,const char* Node)
-
第一个参数:路径(绝对&相对);第二个参数:打开方式(见附表)
FILE* fp = fopen("d:/test.txt","r");//两种方式都可以
FILE* fp1 = fopen("D:\\test.txt","r");//文件指针也叫做"句柄";
if (fp==NULL)//文件打开失败返回指针检查;
{
printf("文件打开失败!%s\n",strerror(errno));//返回错误码,errno是宏;使用"#include<errno.h>",strerror()直接显示错误码的含义;
perror("文件打开失败:");//直接根据错误类型返回含义还可以自定义,很智能;
return 1;
}
关闭文件
fclose (fp);
- 如果打开文件之后,忘记关闭文件,会导致句柄泄露/资源泄露/文件描述符泄露(一个程序可以打开的文件书是有限的);程序结束文件关掉;
读文件
fread(void*ptr,size_t size,size_t count,FILE* stream);
- size_t size:元素长度;size_t count第二个参数:元素个数;
char buf[1024] = {0};//创建存放文件数据的缓冲区;
fread(buf,1,4,fp);//返回实际读取元素个数;因为你要1000个元素但文件里可能只有100个;
写文件
fwrite(void*ptr,size_t size,size_t count,FILE* stream);
char buf[1024] = "aaa";//存放进文件的数据;
fread(buf,1,strlen(buf),fp);//注意修改文件的读取方式为"w";
文件的随机读写
int fseek(FILE* stream,long int offset,int origin);
- offset:偏移量;origin:起始位置;
附表:
文件使用方式 | 含义 | 如果指定文件不存在 |
---|---|---|
"r"只读 | 打开文本文件输入数据 | 出错 |
"w"只写 | 打开文本文件输出数据 | 建立一个新的文件 |
"a"追加 | 向文本文件末尾添加数据 | 出错 |
"r+"读写 | 打开一个文本文件进行读写 | 出错 |
"w+"读写 | -同上- | 建立一个新的文件 |
"a+"读写 | 打开文本文件在文件尾进行读写 | 建立一个新的文件 |
"rb"只读 | 打开二进制文件输入数据 | 出错 |
"wb"只写 | 打开二进制文件输出数据 | 建立一个新的文件 |
"ab"追加 | 向二进制文件末尾添加数据 | 出错 |
"rb+"读写 | 打开一个二进制文件进行读写 | 出错 |
"wb+"读写 | -同上- | 建立一个新的文件 |
"ab+"读写 | 打开二进制文件在文件尾进行读写 | 建立一个新的文件 |
- 按照写方式打开会清空文本所有内容,所以最好使用"a";
tips
- 文件指针也叫做句柄,"遥控器"方便操作;天子对于曹操
- F12,Alt+g跳转到定义;