#Linux #C语言 #标准IO #fopen
前言
标准IO是C语言应用开发非常重要的模块,也是嵌入式Linux笔试、面试高频考点。本文梳理Linux下7种文件类型、标准IO库函数 fopen/fclose/fgetc/fputc/fgets/fputs 以及main函数命令行传参 argc/argv ,附带考试易错点和实战代码(模拟cat、模拟cp)。
一、Linux文件操作基础
-
文件
-
文件可以长期保存数据,断电数据不丢失。
-
Linux哲学:一切皆文件,应用层全部可以通过文件接口访问。
查看文件详细信息命令: ls -l
- Linux七种文件类型
标识 类型 说明举例
b block 块设备文件,硬盘、存储设备
c character 字符设备文件,鼠标、键盘、显示器
d directory 目录文件,文件夹
- regular 普通文件, .c .txt .h
l link 软链接文件,快捷方式
s socket 套接字文件,网络通信
p pipe 管道文件,用于进程间通信
-
文件操作分类
-
标准IO:C标准库提供,库函数,头文件 <stdio.h> , printf scanf fgetc fputc 。
-
文件IO:Linux系统调用,内核提供接口。
文件操作统一思想:打开文件 → 读写文件 → 关闭文件
二、标准IO库函数
- fopen 打开文件
函数原型
FILE *fopen(const char *pathname, const char *mode);
-
参数
-
pathname :要打开的文件名
-
mode :打开模式
|模式|作用|
|----|----|
| r |只读,文件必须存在|
| r+ |读写,文件必须存在|
| w |只写;不存在创建,存在清空原有内容|
| w+ |读写;不存在创建,存在清空原有内容|
| a |追加只写;不存在创建,存在末尾追加|
| a+ |读写;不存在创建;读从头开始,写永远在末尾|
-
返回值
-
成功:返回 FILE* 文件流指针
-
失败:返回 NULL
- fclose 关闭文件
int fclose(FILE *stream);
-
参数:已经打开的文件流指针
-
返回:成功返回 0 ;失败返回 EOF(-1)
⚠注意:打开文件用完必须关闭,否则造成文件描述符泄漏。
- fputc 向文件写入单个字符
int fputc(int c, FILE *stream);
-
参数
-
c :要写入字符(int类型,保存ASCII)
-
stream :目标文件流指针
-
返回:成功返回写入字符;失败返回 EOF(-1)
系统预打开三个流(程序启动自动打开)
-
stdin :标准输入流 → 键盘
-
stdout :标准输出流 → 终端屏幕
-
stderr :标准错误流 → 终端屏幕
示例: putchar('a') 等价于 fputc('a',stdout);
- fgetc 从文件读取单个字符
int fgetc(FILE *stream);
-
参数:文件流指针
-
返回:成功返回读到字符;读到文件末尾/失败返回 EOF(-1)
⚠变量接收返回值必须用 int ch ,不能char ch,因为EOF=-1。
- fputs 写字符串
int fputs(const char *s, FILE *stream);
-
功能:把字符串写入文件,不会写入'\0'
-
返回:成功>=0;失败返回 EOF(-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;
}
小结
-
Linux一共7种文件类型, ls‑l 第一位字符代表文件类型。
-
标准IO操作流程: fopen 打开 → 读写函数操作 → fclose 关闭,切记关闭文件。
-
fgetc 返回值务必用 int 接收; while((ch=fgetc(fp))!=EOF) 括号不能丢, != 优先级高于 = 。
-
argc/argv 用于接收终端命令行参数,实现类似 cat、cp 工具。
-
打开多个文件,中间出错时,已经打开的文件要手动 fclose ,防止资源泄漏。