🍑个人主页:Jupiter. 🚀 所属专栏:Linux从入门到进阶 欢迎大家点赞收藏评论😊
📕文章目录
📚基础知识铺垫
文件由文件属性与文件内容构成,所以空文件也会占用空间的,因为有文件属性。文件=文件内容+属性
。
对文件进行操作的时候,都是通过执行代码的方式完成操作,操作必须先将文件打开,打开文件
的目的就是将文件从磁盘加载到内存
。(内存级文件,没有打开的就在磁盘)
是谁打开文件呢?是进程在打开(这个很好理解,不赘述)。注意:一个进程可以打开多个文件。
在一定时间内,系统中存在多个进程,同时可能存在更多的被打开的文件,OS系统会管理这些文件,先描述,再组织
。后续文章会具体讲解OS怎么管理的。
🍑重新使用C语言文件接口---对比重定向
🎈fopen函数
简单介绍:
参数一:需要打开的文件路径。
参数二:是以哪种方式打开。
打开方式选项的介绍:
选项 | 打开方式 | 注意事项 |
---|---|---|
r | 以只读的方式打开 | 文件不存在,则打开失败,返回NULL |
r+ | 以读写的方式打开 | 文件不存在,则打开失败,返回NULL |
w | 以只写的方式打开 | 文件不存在,则创建文件,返回文件的指针 ,每次写之前会将文件清空 |
w+ | 以读写方式打开 | 文件不存在,则创建文件,返回文件的指针 ,每次写之前会将文件清空 |
a | 以追加写的方式打开 | 文件不存在,则创建文件,返回文件的指针 ,不会清空,在文件末尾追加的方式写 |
a+ | 以读与追加写的方式打开 | 文件不存在,则创建文件,返回文件的指针 ,不会清空,在文件末尾追加的方式写 |
我们可以发现,指令> 与 >>
与选项w和a
有类似的效果。输出与追加重定向
的本质就是向文件里面写入,向文件里面写入需要先打开文件,这里猜测输出重定向
之前文件要以w
的方式打开,所以会先被清空,而追加重定向
是以a
的方式打开。
补充知识
以w等其他方式打开,如果文件不存在,则会在当前目录
下建立一个文件。
那什么叫做当前目录呢?
- 上一篇自定以shell里面已经知道了进程的当前路径可以通过环境变量来获取,这里介绍一个新的方法:通过指令
ls
查看文件./proc/进程编号
来查看,其中cwd
即使当前目录。如图所示:
其中可以使用该函数chdir
来改变当前工作路径,使新建文件建立在指令路径中,上一篇文章讲过,这里不再赘述。
向文件中写操作的接口很多,比如fwrite,fputs,puts....
简单介绍几个:
🌏fputs
简单介绍:
参数一:是一个字符串,想要写进文件的内容。
参数二:是想写进哪一个文件。
代码示例:
cpp
int main()
{
FILE* fp = fopen("log.txt","w");
if(fp==NULL)
{
perror("fopen");
}
const char* msg="hello fputs";
fputs(msg,fp);
fclose(fp);
}
🌙fwrite
简单介绍:
参数一:要写入的字符串。
参数二:写入基本单元的大小。
参数三:要写多少个基本单元。
参数四:写进哪一个文件。
如果成功就返回写的数据块的个数,失败就返回0。
示例代码:
cpp
int main()
{
FILE* fp = fopen("log.txt","w");
if(fp==NULL)
{
perror("fopen");
}
const char* msg="hello fputs";
//fputs(msg,fp);
size_t n = fwrite(msg,strlen(msg),1,fp); //n=1
//size_t n = fwrite(msg,1,strlen(msg),fp); //n=strlen(msg)
printf("%d\n",n);
fclose(fp);
return 0;
}
介绍几个读文件的接口:
🚀fread(一次全部读取)
简单介绍:
参数一:读出来的内容放到ptr字符串中。
参数二:读的基本单元的大小。
参数三:要读多少个基本单元。
参数四:从哪一个文件读。
返回值:如果成功就返回写的数据块的个数,失败就返回0。
代码示例:
cpp
int main()
{
FILE* fp = fopen("log.txt","r");
if(fp==NULL)
{
perror("fopen");
}
char* msg;
size_t n = fread(msg,strlen(msg),1,fp); //n=1
printf("%d\n",n);
fclose(fp);
return 0;
}
🔍fgets(按行读取)
简单介绍:
参数一:读取的内容放在哪里。
参数二:读取的大小 ,参数三:从哪里读。
返回值:成功返回s,失败返回NULL。
示例代码:
cpp
int main()
{
FILE* fp = fopen("log.txt","r");
if(fp==NULL)
{
perror("fopen");
}
char buffer[64];
while(1)
{
char* rstr = fgets(buffer,sizeof(buffer),fp);
if(rstr==NULL) break;
printf("%s\n",buffer);
}
fclose(fp);
return 0;
}
🌌C标准输入输出流
C 默认会打开三个输入输出流,分别是stdin
(标准输入,键盘设备), stdout
(标准输出,显示器设备), stderr
(标准错误,显示器设备)
仔细观察发现,这三个流的类型都是FILE
*, fopen返回值类型,文件指针
。
这些是可以直接使用的。
示例代码:
cpp
int main()
{
char *msg = "hello world";
fputs(msg,stdout); //msg字符串打印在标准输出(显示器上)
return 0;
}
⭐fscanf
简单介绍:
fscanf 与scanf 相比多了第一个参数,scanf
是从标准输入
获取数据,fscanf
是从stream
中获取数据;
代码示例:
cpp
int main()
{
FILE* fp = fopen("log.txt","r");
if(fp==NULL)
{
perror("fopen");
}
int n = 0;
fscanf(fp,"%d",&n);
printf("%d\n",n);
fclose(fp);
return 0;
}