当前位置: 首页 > news >正文

【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, …))输出内容到显示器,无需手动打开即可操作,这也验证了进程启动时默认关联核心输入输出文件的特性。


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

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

http://www.jsqmd.com/news/288741/

相关文章:

  • 【运营硬核】复杂的“参数表”和“爆炸图”怎么翻?揭秘 AI 如何智能修复线条与结构!
  • Qwen3-4B-Instruct最佳实践:镜像部署+API服务封装教程
  • 新加坡top10研究生留学中介深度评测,性价比高保障解析
  • 手把手教你部署GPT-OSS-20B,网页端玩转开源大模型
  • 郑州硕士留学中介top10全面解析,哪家申请成功率高
  • 小白也能懂的AI抠图教程,科哥UNet WebUI三步搞定人像提取
  • 柠檬酸颗粒污泥处理新标杆:2026年优选企业概览,可靠的柠檬酸颗粒污泥推荐排行优质企业盘点及核心优势详细解读
  • 3款热门说话人识别工具测评:CAM++镜像部署最便捷
  • 2026年市面上热门的除尘器骨架厂家口碑排行榜,电磁脉冲阀/通风蝶阀/除尘器气包/通风阀门,除尘器骨架加工厂排名
  • 2026年口碑好的新风换气机采购排行,直膨式空调机组/吊顶式空调机组/卡式风机盘管,新风换气机公司排行
  • 亲测BSHM人像抠图镜像,3行代码搞定专业级图像分割
  • 广州展厅设计哪家强?2026口碑公司精选排行,会展服务/展厅装修/展厅制作/展陈设计/展览工厂,展厅设计公司联系方式
  • Qwen-Image-2512-ComfyUI快速入门:新手必知的5个操作技巧
  • 2026铝单板/幕墙铝单板厂家推荐新疆中天铝铝业,专业定制,品质卓越
  • Z-Image-Turbo快速上手指南:Python脚本调用参数详解
  • 分享|职业技术培训|人工智能算法工程师快问快答
  • 告别复杂配置!SenseVoiceSmall开箱即用的AI体验
  • 什么是企业IM?即时通讯软件都能做什么?
  • Llama3-8B适合初创公司吗?低成本落地实战分析
  • 录音真伪鉴别利器:CAM++相似度判定实战应用
  • NewBie-image-Exp0.1如何省算力?Jina CLIP轻量化编码器部署案例
  • 蛋白质质谱鉴定的那些事
  • Emotion2Vec+语音情感系统使用技巧,提升识别准确率
  • 2026亲测!四川靠谱有机肥厂家推荐
  • 大资料时代的分布式基石Hadoop
  • Open-AutoGLM+ADB:零配置实现远程手机自动化
  • 捷豹改装品牌机构推荐,看哪家口碑好?
  • 零基础也能用!Z-Image-Turbo文生图模型保姆级教程
  • 浏览器兼容性测试:Chrome/Edge/Firefox都能跑CosyVoice2-0.5B
  • 企业级测试方案:Open-AutoGLM+H800高效部署