【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;
 }      

相关推荐
秃头佛爷6 分钟前
Python学习大纲总结及注意事项
开发语言·python·学习
Lary_Rock1 小时前
RK3576 LINUX RKNN SDK 测试
linux·运维·服务器
dayouziei2 小时前
java的类加载机制的学习
java·学习
云飞云共享云桌面3 小时前
8位机械工程师如何共享一台图形工作站算力?
linux·服务器·网络
Peter_chq4 小时前
【操作系统】基于环形队列的生产消费模型
linux·c语言·开发语言·c++·后端
一坨阿亮5 小时前
Linux 使用中的问题
linux·运维
dsywws6 小时前
Linux学习笔记之vim入门
linux·笔记·学习
晨曦_子画6 小时前
3种最难学习和最容易学习的 3 种编程语言
学习
幺零九零零6 小时前
【C++】socket套接字编程
linux·服务器·网络·c++
城南vision6 小时前
Docker学习—Docker核心概念总结
java·学习·docker