news 2026/9/14 8:41:41

【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/9/9 20:54:36

亲测BSHM人像抠图镜像,3行代码搞定专业级图像分割

亲测BSHM人像抠图镜像&#xff0c;3行代码搞定专业级图像分割 你有没有遇到过这样的情况&#xff1a;手头有一张人物照片&#xff0c;想快速把人像单独抠出来换背景&#xff0c;但用PS太费时间&#xff0c;手动描边又不够精细&#xff1f;最近我在做内容创作时就碰上了这个痛点…

作者头像 李华
网站建设 2026/9/4 8:12:03

Linux 终端编码设置影响shell脚本执行的案例分享

本文介绍一个经验案例&#xff0c;由于终端会话的环境变量或编码设置发生了变化导致同一个shell脚本间歇性无法执行。以下是一些排查和解决方案&#xff1a; 1. 检查终端编码设置 # 查看当前终端的编码 echo $LANG echo $LC_ALL echo $LC_CTYPE# 正常情况下应该显示类似&#x…

作者头像 李华
网站建设 2026/9/8 21:52:52

亲测好用9个AI论文写作软件,自考毕业论文必备!

亲测好用9个AI论文写作软件&#xff0c;自考毕业论文必备&#xff01; 自考论文写作的“得力助手” 随着人工智能技术的不断发展&#xff0c;AI 工具在学术写作中的应用越来越广泛。对于自考学生来说&#xff0c;撰写毕业论文不仅是对专业知识的总结&#xff0c;更是对学习成…

作者头像 李华
网站建设 2026/9/12 17:51:41

什么是UEBA

文章目录 UEBA的原理UEBA的作用UEBA与UBA对比UEBA与SIEM对比UEBA与NTA对比华为如何实现UEBA UEBA&#xff08;User and Entity Behavior Analytics&#xff0c;用户和实体行为分析&#xff09;主要用于检测用户以及网络中实体&#xff08;网络设备、进程、应用程序等&#xff0…

作者头像 李华
网站建设 2026/9/10 16:52:43

TurboDiffusion技术亮点:稀疏线性注意力SLA实战应用

TurboDiffusion技术亮点&#xff1a;稀疏线性注意力SLA实战应用 1. TurboDiffusion是什么&#xff1f; TurboDiffusion是由清华大学、生数科技与加州大学伯克利分校联合推出的视频生成加速框架&#xff0c;专为文生视频&#xff08;T2V&#xff09;和图生视频&#xff08;I2V…

作者头像 李华
网站建设 2026/9/11 3:33:33

人工智能应用-机器视觉:AI 鉴伪 04.DEEPFAKE 换脸技术

近年来&#xff0c;基于深度学习的换脸技术——Deepfake 引起了广泛关注。与传统方法相比&#xff0c;Deepfake 技术能够生成极为逼真的图片和视频。Deepfake 采用了自编码器&#xff08;Autoencoder&#xff09;结构&#xff0c;其核心设计是不同人共享一个编码器&#xff0c;…

作者头像 李华