【Linux学习】文件系统 - 第一篇


🍑个人主页: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;
 }      

相关推荐
leaoleao沄2 分钟前
linux-IO-进程-线程(相关函数)
linux·运维·服务器
天下无贼!13 分钟前
2024年最新版TypeScript学习笔记——泛型、接口、枚举、自定义类型等知识点
前端·javascript·vue.js·笔记·学习·typescript·html
秋秋秋叶19 分钟前
Python学习——【2.3】for循环
python·学习
frank006007121 分钟前
linux 使用mdadm 创建raid0 nvme 磁盘
linux·运维
绿白尼23 分钟前
进程与线程
linux
iangyu24 分钟前
linux命令之pwdx
linux·运维·服务器
C语言扫地僧1 小时前
Docker 镜像制作(Dockerfile)
linux·服务器·docker·容器
Xinan_____1 小时前
Linux——高流量 高并发(访问场景) 高可用(架构要求)
linux·运维·架构
周伯通*1 小时前
Windows上,使用远程桌面连接Ubuntu
linux·windows·ubuntu