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

相关推荐
Initialize-le8 分钟前
服务器时间不准?NTP 时钟同步五步排查
运维·服务器
AR-26710-9 分钟前
Linux Day24——TCP/IP分层与封装
linux·运维
该逃避避10 分钟前
如何利用代理IP进行更好广告验证?
linux·服务器·网络
m0_6174939411 分钟前
昇腾 NPU Docker 部署实战:解决 stub library 报错并实现模型正常加载
运维·docker·容器
小羊没烦恼!21 分钟前
.NET 11 Runtime Async 详解
java·运维·开发语言·javascript·python
水饺编程1 小时前
第2章:Linux 基础,重启命令
linux·c语言·汇编
金色熊族1 小时前
在Qt中使用asan检测内存泄漏(一)
linux·qt·asan
第404号工位1 小时前
“已彻底删除”的照片与文件到底去哪了?我用底层扇区扫描,扒出手机和电脑的幽灵数据
linux·python·架构
xianyuCcCcCCCcc1 小时前
Ceph 分布式存储:集群配置与存储池管理
运维·分布式·ceph
硅基手札2 小时前
SPI技术系列 12 · SPI 设备驱动实战
linux·驱动开发·单片机·嵌入式硬件·mcu·性能优化·系统架构