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

相关推荐
苹果嘉尔121385 小时前
Linux系统编程——网络(TCP)
linux·运维·服务器
网安蟹佬霸5 小时前
区块链与智能合约安全实战:从Solidity审计到DeFi漏洞深度剖析
运维·前端·网络·安全·自动化·区块链·智能合约
昌原的儿子LEO5 小时前
Linux进程知识点总结
linux·服务器·c语言·数据库
koi77u5 小时前
嵌入式学习---进程与线程(1)
linux·服务器·学习
椿.湫6 小时前
kubenetes pod管理
linux·运维·服务器
敲代码还房贷6 小时前
安装wsl报错:HCS_E_HYPERV_NOT_INSTALLED
linux·python·ubuntu
竣达技术6 小时前
告别人工巡检!竣达 BMS 电池巡检云监控终端,为蓄电池筑牢安全防线
运维·监控系统·机房监控
GuoFeng.Wan6 小时前
深入理解经典蓝牙的channel
linux·服务器·网络
朝发如雪6 小时前
快速掌握Linux(1)(Linux文件操作)(标准IO)
linux·运维·服务器
一直C6 小时前
【Linux应用编程】深入理解Linux多任务机制:进程原理、状态转换与进程控制实战
linux·开发语言·算法·ubuntu·vim·visual studio code