
📕文章目录
- `📚基础知识铺垫`
- `🍑重新使用C语言文件接口---对比重定向`
- `🎈fopen函数`
- `🌏fputs`
- `🌙fwrite`
- `🚀fread(一次全部读取)`
- `🔍fgets(按行读取)`
- `🌌C标准输入输出流`
- `⭐fscanf`
📚基础知识铺垫
文件由文件属性与文件内容构成,所以空文件也会占用空间的,因为有文件属性。文件=文件内容+属性。
对文件进行操作的时候,都是通过执行代码的方式完成操作,操作必须先将文件打开,打开文件的目的就是将文件从磁盘加载到内存。(内存级文件,没有打开的就在磁盘)
是谁打开文件呢?是进程在打开(这个很好理解,不赘述)。注意:一个进程可以打开多个文件。
在一定时间内,系统中存在多个进程,同时可能存在更多的被打开的文件,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

简单介绍:
参数一:是一个字符串,想要写进文件的内容。
参数二:是想写进哪一个文件。
代码示例:
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。
示例代码:
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。
代码示例:
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。
示例代码:
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返回值类型,文件指针。
这些是可以直接使用的。
示例代码:
int main()
{
char *msg = "hello world";
fputs(msg,stdout); //msg字符串打印在标准输出(显示器上)
return 0;
}
⭐fscanf

简单介绍:
fscanf 与scanf 相比多了第一个参数,scanf是从标准输入获取数据,fscanf是从stream中获取数据;
代码示例:
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;
}
![[云原生]三、Kubernetes(1.18)](https://i-blog.csdnimg.cn/direct/733b5754ee894f95aa9ebe5ab6ddb36d.png)


















