news 2026/2/8 1:28:16

【Linux】基础IO(一):C 接口文件讲解

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【Linux】基础IO(一):C 接口文件讲解

✨道路是曲折的,前途是光明的!

📝 专注C/C++、Linux编程与人工智能领域,分享学习笔记!

🌟 感谢各位小伙伴的长期陪伴与支持,欢迎文末添加好友一起交流!

  • 一、文件核心认知
    • 1.1 文件的基础属性与分类
    • 1.2 进程与打开文件的关系
    • 1.3 补充(关联系统层面认知)
  • 二、C语言文件IO
    • 2.1 打开文件
    • 2.2 思考:打开文件所在的位置?
    • 2.3 写入文件
    • 2.4 默认打开的三个流

一、文件核心认知

1.1 文件的基础属性与分类

  1. 文件本质:文件 = 内容 + 属性,即使是0KB空文件也占用磁盘空间(存储属性)。
  2. 文件分类与核心问题
  3. 未打开的文件:存储在磁盘上,核心问题是“存储与管理”——通过分门别类的组织方式实现文件的快速增删查改;
  4. 打开的文件:由进程打开,核心是研究“进程与文件的关系”,也是本文的核心研究目标。

1.2 进程与打开文件的关系

  1. 加载逻辑
  • 文件被打开时会加载到内存;进程启动时,操作系统默认打开 stdin、stdout、stderr 三个文件流,一个进程可打开多个文件,因此进程与打开的文件是1:n(一对多)的关系。
  1. 系统管理逻辑
  2. 操作系统需管理大量被打开的文件,遵循“先描述、再组织”的核心原则;
  3. 描述:内核为每个打开的文件创建“文件打开对象”(结构体),包含文件属性等关键信息;
  4. 组织:文件打开对象通过内置指针链接成双链表,将对文件的管理转化为对双链表的增删查改操作。

1.3 补充(关联系统层面认知)

  • 狭义上文件是磁盘(永久存储外设)上的存储单元,对文件的操作本质是对磁盘的IO;广义上Linux“一切皆文件”,硬件均被抽象为文件管理;
  • 文件读写并非直接通过C/C++语言实现,而是依赖操作系统提供的文件系统调用接口。

二、C语言文件IO

从“文件小白“到“IO大侠“:C语言文件操作全攻略-CSDN博客

2.1 打开文件

向一个文件写入内容,我们肯定得先打开文件,但是为了避免文件打开占用内存资源,造成资源泄漏,所以打开后我们需要关闭文件。这里我们需要使用到两个函数fopen,fclose


  1. fopen

fopen 打开文件,失败返回 NULL,成功返回指向 FILE 结构体的指针(通过该指针操作文件);我们在这里仅研究w(写)、a(追加写)两种打开方式。

  1. fclose

  • 这里我们以写的方式打开和关闭文件!

#include<stdio.h>intmain(){FILE*fp=fopen("hello.txt","w");if(fp==NULL){perror("fopen");return1;}fclose(fp);return0;}

我们先查看一下当前目录,发现是没有hello.c这个文件的,然后当我们运行后再查看会发现hello.c的文件出现了。

所以当我们以w的方式打开一个不存在的文件的时候,他会给我们自动创建一个以这个名字命名的文件


2.2 思考:打开文件所在的位置?

我们先更改一下代码

这样我们能知道进程的pid码,然后就可以使用ls /proc/[进程id] -l命令查看当前正在运行进程的信息

进程可通过两个关键符号链接确定路径:

  • cwd:指向进程当前运行目录;
  • exe:指向启动进程的可执行文件完整路径。

因此进程打开/创建文件时,即便文件不带路径,操作系统也能通过进程的cwd确定文件的存放位置(本质是进程打开文件,进程自身知晓路径上下文)。

注意:有绝对路径时:操作系统直接按指定的绝对路径创建文件,不再拼接cwd路径。


2.3 写入文件

当我们像写入内如到打开的文件时,我们可以使用fwrite()函数

fwrite 可向以w/a方式打开的文件写入内容,传入参数包括字符串、单份字符串大小、份数、文件流;
写入字符串时,无需将strlen计算的长度+1(即不写入\0——因为\0是C语言区分字符串的专属规则,文件存储的是通用字节流,需适配多语言读取,仅需写入字符串实际内容即可。

#include<stdio.h>#include<sys/types.h>#include<unistd.h>#include<string.h>intmain(){FILE*fp=fopen("hello.txt","w");if(fp==NULL){perror("fopen");return1;}constchar*message="wbushidaitou\n";//const char* message = "Hello! Daitou\n";fwrite(message,strlen(message),1,fp);fclose(fp);return0;}

当我们重新写入不同的内如发现之前写进去的内容被清空了,这是为什么?

<font style="color:rgb(85, 86, 102);background-color:rgb(238, 240, 244);">w</font>方式fopen打开文件时,写入前会先清空文件原有内容,后续通过fwrite写入的内容会从头覆盖,因此最终文件中仅保留新写入的内容(如仅显示"Hello! Daitou")。

  • 我们讲写入的方式从w改成a来试试
FILE*fp=fopen("hello.txt","a");

a方式fopen打开文件写入:保留原有内容,仅在文件末尾追加写入新内容(不会清空/覆盖原有内容)。


2.4 默认打开的三个流

linux下一切皆文件,c语言程序在启动的时候,默认会为我们打开三个输入输出流(文件):

  • stdin是键盘文件(c++中是cin)
  • stdout是显示文件(c++中是cout)
  • stderr是显示器文件(c++中是cerr)
  1. 其中,标准输入流对应的设备就是键盘,标准输出流和标准错误流对应的设备都是显示器。
  2. 查看man手册我们就可以发现,stdin、stdout以及stderr这三个家伙实际上都是FILE*类型的。
externFILE*stdin;externFILE*stdout;externFILE*stderr;

所以我们就可以使用fprintf向显示器文件stdout以及stderr中输入,看显示器是否会进行显示

fprintf 用法与 printf 类似,核心差异在于输出目标:

  • printf:默认将内容输出到显示屏(stdout)
  • fprintf:需显式指定输出的文件流(如指向 log.txt 的 FILE* 指针),可将内容写入任意指定文件。

#include<stdio.h>#include<sys/types.h>#include<unistd.h>#include<string.h>intmain(){FILE*fp=fopen("log.txt","w");if(fp==NULL){perror("fopen");return1;}constchar*message="Daitou\n";fprintf(stdout,"%s",message);fprintf(stderr,"%s",message);fclose(fp);return0;}

因此可直接使用 stdout/stderr(如 fprintf (stdout/stderr, …))输出内容到显示器,无需手动打开即可操作,这也验证了进程启动时默认关联核心输入输出文件的特性。


✍️ 坚持用清晰易懂的图解+可落地的代码,让每个知识点都简单直观

💡座右铭“道路是曲折的,前途是光明的!”

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/2/7 15:21:55

蛋白质质谱鉴定的那些事

蛋白质质谱鉴定的那些事蛋白质根据样品的纯度&#xff0c;鉴定精度的要求不同&#xff0c;可以分为对一级质谱&#xff0c;二级质谱&#xff08;即串联质谱&#xff09;。很多刚接触蛋白质鉴定的新手很可能对一级、二级质谱鉴定方法还不太了解。在这期文章中&#xff0c;小编就…

作者头像 李华
网站建设 2026/2/5 1:28:22

中文语音合成新标杆Sambert:自回归GPT+DiT架构部署教程

中文语音合成新标杆Sambert&#xff1a;自回归GPTDiT架构部署教程 1. 开箱即用&#xff1a;为什么这款语音合成镜像值得你第一时间试试 你有没有遇到过这些场景&#xff1f; 做短视频想配个自然不机械的中文旁白&#xff0c;但试了三四个工具&#xff0c;不是语调生硬就是停…

作者头像 李华
网站建设 2026/2/6 0:33:40

MinerU降本部署案例:GPU按需计费,成本节省60%

MinerU降本部署案例&#xff1a;GPU按需计费&#xff0c;成本节省60% 在企业日常运营中&#xff0c;PDF文档处理是高频刚需——技术文档归档、合同条款提取、学术论文解析、财报数据整理……但传统OCR工具面对多栏排版、嵌入公式、复杂表格时常常“认不出、分不准、排不齐”&a…

作者头像 李华
网站建设 2026/2/7 1:29:14

搭建个人AI画廊:基于麦橘超然的创意实践案例

搭建个人AI画廊&#xff1a;基于麦橘超然的创意实践案例 引言&#xff1a;当AI绘画走进你的书房 你有没有想过&#xff0c;不用登录网页、不依赖云服务、不担心账号封禁&#xff0c;就能在自己电脑上随时生成一张电影级质感的插画&#xff1f;不是试用版&#xff0c;不是限时…

作者头像 李华
网站建设 2026/2/7 5:54:56

2026年轻量大模型趋势:DeepSeek-R1部署实战入门必看

2026年轻量大模型趋势&#xff1a;DeepSeek-R1部署实战入门必看 你是不是也遇到过这样的问题&#xff1a;想在本地服务器上跑一个真正能干活的大模型&#xff0c;但发现动辄7B、13B的模型一加载就爆显存&#xff1f;推理慢、部署卡、调用不稳定……这些不是技术瓶颈&#xff0…

作者头像 李华
网站建设 2026/2/7 23:36:03

PyTorch 2.0自动融合提速实战

&#x1f493; 博客主页&#xff1a;借口的CSDN主页 ⏩ 文章专栏&#xff1a;《热点资讯》 PyTorch 2.0自动融合提速实战&#xff1a;深度优化训练效率的工程实践目录PyTorch 2.0自动融合提速实战&#xff1a;深度优化训练效率的工程实践 引言&#xff1a;为什么自动融合是AI训…

作者头像 李华