day24- 系统编程 概述 及 标准IO
一、系统编程概述
二、 标准IO
2.1 (以计算机为中心)标准IO
I: 键盘是标准输入设备 默认输入就是指键盘 /dev/input
O: 显示器是标准输出设备 默认输出就是指显示器
一般都是对普通文件操作是一种有缓存的IO 在文件IO和用户程序之间,加入缓冲区,可以有效减少系统调用的效率,节省系统IO调度资源
linux中一切都是文件。文件用来存储数据(数据,指令)
2.2 io的分类
头文件: stdio.h 标准输入输出头文件
/usr/include/stdio.h usr前/不可省略,代表最高路径下
<> 是系统库函数,默认路径在/usr/include/
eg : stdio.h ===>stdio.c==>libc.so// 二进制文件 ==>/usr/lib so 动态库
"" 是用户自定义函数,默认是当前路径
eg : ===>xxx.h ===>xxx.c
- ldd 查看该文件用了哪些库
man man ==>所有man的帮助
man xxx == man 1 xxx ===>查看当前xxx命令
man 2 xxx ===>查看xxx对应的系统调用函数
man 3 xxx ===》查看xxx对应的标准库函数
主要使用1. 2. 3.
- 命令行命令
- 系统函数调用
- C库跨平台调用
- 设备类文件介绍
- etc文件配置,相关处理,格式
- 游戏(不建议)
- 总体性描述
- 管理员使用命令
- 内核更新事件
注意:如果没有命令则直接man xxx 会显示其函数\n
如果没有系统调用则显示系统库函数帮助
三、文件读写操作
3.1 操作步骤
- 打开文件,FILE
- io操作,读写操作
- 关闭文件
3.2 详述
3.2.1 FILE
FILE 结构定义的对象
FILE * 称之为流对象,也叫文件流指针
3.2.2 读写操作相关
3.2.2.1 fopen函数
一般形式:fopen(const char * pathname,const char *mode);
mode:
- r 打开文件,读文件(从文件刚开始读,且要求文件存在)
- r+ 打开文件,读写文件(从文件刚开始读,且要求文件存在)
- w 清空文件或创建文件用于写文件(位于文件最开始的地方,文件可以不存在)
- w+ 打开文件,读写文件(位于文件最开始的地方,文件可以不存在)
返回值:成功返回FILE的指针,否则返回空指针
可以使用ll查看文件大小
3.2.2.2 fputc函数
一般形式:int fputc(int c,FILE *stream);
3.2.2.3 fclose函数
一般形式:int fclose(FILE *stream);
使用cat来查看文件内容
3.2.2.4 fgetc函数
一般形式:int fgetc(FILE *stream);
EOF//文件读完,end of file,宏值为-1;
- 文本对照工具:vimdiff 文件1 文件2
3.2.2.5 fgets函数
一般形式:char *fgets(char *s, int size, FILE *stream);
功能:从stream流对象关联的文件中获取size大小字节的文本数据并存储到s对应的本地内存(栈区数组,堆区内存)
参数: s 要存储数据的本地内存
size 要获取的数据长度,单位字节。
stream 要获取的目标文件流对象,
可以是stdin ,程序会阻塞等待
如果是普通文件fp 则指向文件第一行数据
返回值:成功 返回指向有效数据的首地址,一般等于s的地址
失败 或者 文件末尾 NULL;
gets和fgets的区别:
1.gets是危险的,因为没有规范读到数据的上限
2.gets会去掉从终端读入的\n字符
3.fgets会读到n个数据,如果n个数据中存在\n字符则立即停止当 前的读取操作
4.fgets不会去掉从流中读到的\n字符 char buf[1024];
5.fgets(buff, sizeof(buff), stdin); gets(buff);
3.2.2.6 fputs函数
int fputs(const char *s, FILE *stream);
功能:从s所在的本地内存中获取一行数据,并写入stream对应的文件流对象。
参数: s 要写的信息,一般是固定的字符串或者有数据的数组。
stream 要写入的目标文件流对象
返回值:成功 nonnegative number on success
失败 -1(EOF);
3.3 小练习
1.实现 cp命令的功能
优化:
od -c 文件名 默认看二进制文件
od -t x1 文件名 指定格式,以十六进制一个一个打印