stdio
1.基本概念
文件:
一组相关数据的集合
文件名:
01.sh //文件名
2.linux下的文件类型
b block 块设备文件 eg: 硬盘
c character 字符设备文件 eg: 鼠标,键盘
d directory 目录文件 eg: 文件夹
- regular 常规文件 eg: 1.txt 01.sh xx.bmp
l symblink 软链接 eg: 快捷方式
s socket 套接字 eg: 网络通信用
p pipe 管道 eg: 进程间通信
3.思想
linux中一个核心思想
everything is file!
一切皆文件
4.文件的基本操作
打开(新建)
输入(写数据)
阅读(读取)
删除
插入
修改
关闭 (保存)
//研发
1.打开
2.写
3.读
4.关闭
5. linux操作文件的函数
两套函数 (两套操作路径)
(1) 系统调用 --- 内核提供的函数
(2) 库函数 --- 第三方提供的函数
(1).库函数
c library // c库函数
集成了很多功能函数
//标准输入输出
//数学函数
//...
-lm
#include <math.h>
标准输入输出 --- stdio 文件操作
标准io; stdio.h
1.标准io的概念
1975 Dennis r IO库,
从C语言的标准,ANSI c
IO input output
I: 键盘是标准输入设备 ====》默认输入就是指键盘 /dev/input
O: 显示器是标准输出设备 ==》默认输出就是指显示器
Linux操作系统当中IO都是对文件的操作
C一部分,任何支持标准C的系统都可使用标准IO实现文件存储
标准IO在UNIX上是对文件IO的封装
一般都是对普通文件操作是一种有缓存的IO 在文件IO和用户程序之间,
加入缓冲区,可以有效减少系统调用的次数,节省系统IO调度资源
说明:
标准IO库,不单单是linux上有,在windows,Mac os上都有。
很多操作系统都实现了标准IO库。
都是依据IOS C标准实现的。
所以基本保证了可移植性。
但是因为标准和具体实现之间的差异,
未必敢保证所有的函数在都可以相互通用。
标准IO都干了些啥?
标准IO处理了很多细节:
(1).处理缓冲区分配 (缓存--提高效率 --- 慢速 快速)
(2).读写IO的块长度的优化
(3).对系统调用进行了封装,内部对应的"文件描述符"
好处:
用户使用方便,不必再担心如何选择正确的块长度。
//地位:
标准I/O库是由 Dennis Ritchie在1975年左右编写的。
它是Mike Lesk编写的可移植I/O库的主要修改版本。
令人惊讶的是,50年来,几乎没有对标准I/O库进行修改。
6. 函数接口
1.打开 -- fopen //file open
2.写/读
//按字符读写
fgetc/fputc
//按行读写
fgets/fputs
//按对象读写
fread/fwrite
3.关闭
fclose --- file close
fopen
打开数据库中的函数的解释及用法说明
man手册的内容
Name 名字+简短说明
SYNOPSIS 头文件 + 函数原型
DESCRIPTION 函数的一些实用细节说明
RETURN VALUE 返回值
FILE * fopen(const char *pathname,const char *mode);
功能:
流打开函数
参数:
@pathname --- 要打开的文件名 //字符串形式的名字
@mode --- 打开的模式
r --- 只读
r+ --- 读写
说明: 带r的 要求,文件必须存在 ,如果不存在,就会报错
w --- 只写
w+ --- 读写
说明:
文件存在 ,截断成 0长度
不存在,则创建
a --- 追加(写)
a+ --- 读写
说明:
读 从头读
写 从末尾开始写
文件存在 则打开做写操作即可
文件不存在 创建文件
返回值:
成功 FILE*指针 //文件指针 流指针 --- 从程序上讲,FILE *指针就代表打开的这个文件
失败 NULL 同时 errno会被设置
void perror(const char *s);
功能:
打印错误信息
参数:
s //用户自定义字符串
//读写函数
fgetc / fputc
int fgetc(FILE * stream);
功能:
从文件中读取字符
参数:
@stream 表示要读取的文件对应的流指针
返回值:
成功 对应字符的ASCII码值
失败 EOF 到达文件结尾
出错
问题:
EOF
文件中有没有 EOF? //只是到达结尾时的一个标志
int fputc(int c,FILE *stream);
功能:
将一个字符输出到指定的流(文件)
参数:
@c //要输出的字符 ---ascii码值
@stream //指定的文件
返回值:
成功 被写入的字符的ASCII码值
失败 EOF
系统默认打开的流指针:
stdin //标准输入
stdout //标准输出
stderr //标准出错 --- 屏幕 --- 可以专门把错误信息输出到 stder
//关闭:
fclose
int fclose(FILE *stream);
功能:
关闭文件
刷新流
关闭了底层文件描述符
返回值:
成功 0
失败 EOF
注意,不要多次重复关闭
操作函数:
1.打开 -fopen
2.读/写
fgetc/fputc
3.关闭
fclose
//按行读写 ---按字符串读写
fgets / fputs
char * fgets(char*s,int size,FILE*stream)
功能:
从stream中读取size-1个字符,到s指向的空间
参数:
@s //存放读取到的数据 对应的内存空间
@size //指定一次最多读取多少个字符
@stream //表示要读取的文件
返回值:
成功 返回s
失败 NULL
读到文件结尾 也 返回NULL
注意:
fgets读取结束:
1. EOF
2. '\n'
3. size-1
int fputs(const char *s, FILE *stream);
功能:
输出s到stream中
参数:
@s 代表要输出的字符串
@stream 代表 输出到的文件
返回值:
成功 非负数
失败 EOF
注意:
不会将 '\0' 输出
"123" --- 文本文件 --- '1''2''3' //每个数据是按照固定的编码格式存放的 -ASCII
123 --- 二进制 --- 01111011 //
linux下操作时 ,没有区别
windows下区别
说明:
1.fgets 和 fputs 在拷贝 二进制文件时 可能出问题
printf() <=> fprintf(stdout,);