1 标准I/O函数不同于read,write函数,是其在流上进行操作,
当首次调用标准I/O函数时,系统会首先调用malloc,为流创造缓冲区,
2 fopen函数
#include<stdio.h> file * fopen(const char* pathname, const char * restrict name);
打开返回指针,出错返回NULL,
type的取指有r(读),w(写),a(追加),r+/w+(读+写),a+(读+写+追加)
int fclose(file* fp)
成功返回0,失败返回EOF
3 一旦打开流,系统支持三种不同I/O方式,
1每次一个字符
2 每次一行(fgets,fputs)
3 直接I/O,读取某种数量的数据,也称面向结构I/O(fread,fwrite)
1每次一个字符,输入函数
int getc(file * fp) int fgetc(file *fp) int getchar(void)
成功返回下一个字符,失败返回EOF
getchar()等价于getc(stdin),getc与fgetc的区别是getc可能被实现为宏,而fgetc一定是一个函数
EOF被定义为负值,通常为-1
为区分上面函数返回值究竟是错误还是EOF,我们定义这两个函数
int ferror(file* fp); int feof(file * fp);
可以将数据输入回流中
ungetc(int c, file* fp)
成功返回c,失败返回EOF
输出函数,对应于每一个上面的输入函数
int putc(file* fp) int fputc(file* fp) int putchar(void)
2 每次一行
char* fgets(char * buf ,int n ,fille* fp) char * gets(char*buf)
成功返回buf,失败返回NULL
gets直接从stdin读输入,但是非常不推荐这个函数,因为没有指定缓冲区大小,容易造成缓冲区溢出
同样对应着输出函数
int fputs(char* buf, int n, file* fp) int gets(char*buf)
同样不推荐gets
3 面向结构输入输出
size_t fread(void * ptr, size_t size, size_t nobj, file* fp) size_t fwrite(void *ptr , size_t size, size_t nobj, file* fp)
ptr是buf,size是单个结构体的大小,nobj是要读写对象个数
4 ftell和fseek函数
long ftell(file* fp) int fseek(file* fp,long offset ,int whence)
ftell是以字节为度量,返回距文件开头的距离,fseek中的offset也是以字节为度量的偏移
5 这里每一个关于流的I/O函数其实最终都是调用关于文件描述符的I/O完成的
int fileno(file* fp)
将流转换为文件描述符
系统数据文件和信息:
6 /etc/passwd中字段,以及字段含义
root :x :0 :0 :root :/root :/bin/bash
用户名:密码:用户id:组id:注释:工作目录:启动shell
7 getpwuid函数,getpwgid函数,通过uid,gid读取口令文件
#include<pwd.h> struct passwd* getpwuid(uid_t uid) struct passwd* getpwnam(const char* name)