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 ,防止资源泄漏。

相关推荐
Alluxio20 分钟前
Alluxio + OCI:为 AI 工作负载实现亚毫秒访问延迟与可扩展吞吐
运维·数据库·人工智能·分布式·缓存·ai·语言模型
StarsGreen2 小时前
libva在intel平台上的前端流程简介
linux
坤坤子吖5 小时前
Linux网络编程:自定义应用层协议与 JSON 序列化
linux·服务器·网络·c++·笔记·json
Sayai5 小时前
Neo4j 图数据质量检查实战:环路检测、孤立节点与连通分量,两条 Cypher 引出的数据体检清单(含变长路径性能陷阱)
运维·neo4j·图数据库·数据质量·cypher
Elastic 中国社区官方博客5 小时前
更少的位数,相同的召回率:DiskBBQ 更保守的自动校准扫描
大数据·运维·开发语言·人工智能·elasticsearch·搜索引擎
方便面不加香菜5 小时前
Docker Volume -- 管理卷Volume详解
运维·docker·容器
沫璃染墨6 小时前
从零入门计算机网络系列(十八):TCP连接管理详解——从三次握手与四次挥手到TIME_WAIT机制
运维·服务器·网络·c++·网络协议·tcp/ip·tcp
Felven6 小时前
华为鲲鹏920s芯片serdestool工具使用说明
linux·运维·服务器·华为·鲲鹏920·serdestool
江湖有缘6 小时前
Docker实战 | 使用Docker部署lemonitor镜像站点列表程序
运维·docker·容器
莫晓燚7 小时前
mall 电商项目完整部署---实战
linux·运维·docker·容器