Linux入门DAY25(标准IO学习)

#Linux #C语言 #标准IO #fopen

前言

标准IO是C语言应用开发非常重要的模块,也是嵌入式Linux笔试、面试高频考点。本文梳理Linux下7种文件类型、标准IO库函数 fopen/fclose/fgetc/fputc/fgets/fputs 以及main函数命令行传参 argc/argv ,附带考试易错点和实战代码(模拟cat、模拟cp)。

一、Linux文件操作基础

  1. 文件

  2. 文件可以长期保存数据,断电数据不丢失。

  3. Linux哲学:一切皆文件,应用层全部可以通过文件接口访问。

查看文件详细信息命令: ls -l

  1. Linux七种文件类型

标识 类型 说明举例

b block 块设备文件,硬盘、存储设备

c character 字符设备文件,鼠标、键盘、显示器

d directory 目录文件,文件夹

  • regular 普通文件, .c .txt .h

l link 软链接文件,快捷方式

s socket 套接字文件,网络通信

p pipe 管道文件,用于进程间通信

  1. 文件操作分类

  2. 标准IO:C标准库提供,库函数,头文件 <stdio.h> , printf scanf fgetc fputc 。

  3. 文件IO:Linux系统调用,内核提供接口。

文件操作统一思想:打开文件 → 读写文件 → 关闭文件

二、标准IO库函数

  1. fopen 打开文件

函数原型

FILE *fopen(const char *pathname, const char *mode);

  • 参数

  • pathname :要打开的文件名

  • mode :打开模式

|模式|作用|

|----|----|

| r |只读,文件必须存在|

| r+ |读写,文件必须存在|

| w |只写;不存在创建,存在清空原有内容|

| w+ |读写;不存在创建,存在清空原有内容|

| a |追加只写;不存在创建,存在末尾追加|

| a+ |读写;不存在创建;读从头开始,写永远在末尾|

  • 返回值

  • 成功:返回 FILE* 文件流指针

  • 失败:返回 NULL

  1. fclose 关闭文件

int fclose(FILE *stream);

  • 参数:已经打开的文件流指针

  • 返回:成功返回 0 ;失败返回 EOF(-1)

⚠注意:打开文件用完必须关闭,否则造成文件描述符泄漏。

  1. fputc 向文件写入单个字符

int fputc(int c, FILE *stream);

  • 参数

  • c :要写入字符(int类型,保存ASCII)

  • stream :目标文件流指针

  • 返回:成功返回写入字符;失败返回 EOF(-1)

系统预打开三个流(程序启动自动打开)

  • stdin :标准输入流 → 键盘

  • stdout :标准输出流 → 终端屏幕

  • stderr :标准错误流 → 终端屏幕

示例: putchar('a') 等价于 fputc('a',stdout);

  1. fgetc 从文件读取单个字符

int fgetc(FILE *stream);

  • 参数:文件流指针

  • 返回:成功返回读到字符;读到文件末尾/失败返回 EOF(-1)

⚠变量接收返回值必须用 int ch ,不能char ch,因为EOF=-1。

  1. fputs 写字符串

int fputs(const char *s, FILE *stream);

  • 功能:把字符串写入文件,不会写入'\0'

  • 返回:成功>=0;失败返回 EOF(-1)

  1. fgets 读取一行字符串

char *fgets(char *s, int size, FILE *stream);

  • 参数

  • s :存放读取数据的缓冲区首地址

  • size :最多读取 size‑1 个字符

  • stream :文件流

  • 返回:成功返回缓冲区 s ;读到末尾/失败返回 NULL

  • 特点:读到换行符结束,会把换行符 \n 一并读入缓冲区。

三、main函数命令行传参 argc argv

int main(int argc, char *argv\[\])

  • argc :命令行参数总个数

  • argv :字符串指针数组,存放每一个参数字符串

示例: ./mycat 1.txt

  • argc = 2

  • argv0 → "./mycat" 程序名

  • argv1 → "1.txt"

  • argvargc 默认为 NULL

实战代码1:模拟cat命令(fgetc+fputc)

#include <stdio.h>

int main(int argc, char *argv\[\])

{

FILE *fp;

int ch;

if(argc != 2)

{

printf("用法:%s 文件名\n",argv0);

return -1;

}

fp = fopen(argv1,"r");

if(NULL == fp)

{

perror("fopen");

return -1;

}

while( (ch = fgetc(fp)) != EOF )

{

fputc(ch,stdout);

}

fclose(fp);

return 0;

}

实战代码2:模拟cp复制文件

#include <stdio.h>

int main(int argc, char *argv\[\])

{

FILE *fp_src,*fp_dst;

int ch;

if(argc != 3)

{

printf("用法:%s 源文件 目标文件\n",argv0);

return -1;

}

fp_src = fopen(argv1,"r");

if(NULL == fp_src)

{

perror("open src");

return -1;

}

fp_dst = fopen(argv2,"w");

if(NULL == fp_dst)

{

perror("open dst");

fclose(fp_src);

return -1;

}

while( (ch = fgetc(fp_src)) != EOF )

{

fputc(ch,fp_dst);

}

fclose(fp_src);

fclose(fp_dst);

return 0;

}

小结

  1. Linux一共7种文件类型, ls‑l 第一位字符代表文件类型。

  2. 标准IO操作流程: fopen 打开 → 读写函数操作 → fclose 关闭,切记关闭文件。

  3. fgetc 返回值务必用 int 接收; while((ch=fgetc(fp))!=EOF) 括号不能丢, != 优先级高于 = 。

  4. argc/argv 用于接收终端命令行参数,实现类似 cat、cp 工具。

  5. 打开多个文件,中间出错时,已经打开的文件要手动 fclose ,防止资源泄漏。

相关推荐
_upupup22 分钟前
包管理器和vim
linux·服务器
ESDWAN27 分钟前
SD-WAN 企业选型与落地指南:从链路测试到网络架构设计
运维·网络·架构
一颗小树x28 分钟前
NVIDIA 驱动故障排查实录:内核升级导致 nvidia-smi 失效
linux·服务器·nvidia驱动·启动失败·内核升级
啊哈一半醒32 分钟前
Docker 底层知识:从 Namespace 到 UnionFS
运维·docker·容器
_smart_boy__38 分钟前
I.MX6U开发板Uboot无法ping Ubuntu问题解决方案(二)
linux·运维·ubuntu
DianSan_ERP1 小时前
多平台订单自动下载与回传的技术实现:从消息推送到状态闭环引言
java·linux·服务器·前端·网络·架构·自动化
Android系统攻城狮1 小时前
Linux Gstreamer深度解析之gst_audio_decoder_get_parse_state调用流程与实战(四十九)
linux·音视频·gstreamer音视频·gstreamer音视频进阶
~光~~1 小时前
【嵌入式Linux学习】GFP_NOIO / GFP_NOFS(Linux 内核 gfp 分配标志)
linux·运维·学习
坤坤子吖1 小时前
ELF加载、动态链接、GOT与PLT
linux·笔记·学习
涵美女程序猿1 小时前
ChatCut online 剪负载均衡健康检查演练录屏:后端池、探针路径与摘除阈值怎样对应
运维·程序人生·电脑·负载均衡