APUE标准IO

pag111
流定向决定了所读、写的字符是单字节还是多字节的。
int fwide(FILE *fp, int mode);//设置流定向

文件描述符:
STDIN_FILENO、STDOUT_FILENO、STDERR_FILENO
文件指针
stdin、stdout、stderr

默认缓冲机制
标准出错---------------------不带缓冲
终端设备流------------------行缓冲
其他流-----------------------全缓冲

行缓冲限制
1、只要填满了缓冲区,即使没有写一换行符,也进行IO操作。
2、任何时候只要通过标准IO库要求从(a)一个不带缓冲的流,或者(b)一个行缓冲的流(要求从内核得到数据)的到输入数据,那么会造成冲洗所有行缓冲输出流(fgets,gets等循环调用会冲洗输出流)

void setbuf(FILE *restrict fp, char *restrict buf);//更改缓冲类型
int setvbuf(FILE *restrict fp, char *restrict buf, int mode, size_t size);//_IOFBF/_IOLBF/_IONBF
如果要使用改变缓冲类型函数,则要在 打开流后并且在对该流执行任何操作之前
int fflush(FILE *fp);//强制冲洗一个流(fd=NULL,冲洗所有输出流)

FILE * fopen(const char *restrict pathname, const char *restrict type);//打开标准IO流,指定文件
FILE * freopen(const char *restrict pathname, const char *restrict type, FILE *restrict fd);//在指定流上打开指定文件, 此函数一般用于将一个指定的文件打开为一个预定义的流:标准输入、标准输出、标准出错
FILE * fdopen(int filedes, const char *type);//获取现有描述符与一个标准IO流结合(与fileno相对)(open,dup,dup2,fcntl,pipe,socket,socketpair,ept获得描述符),不能截断他为写而打开的任一文件

当以读和写类型打开一文件时(+)具有以下限制:( 此限制不是很理解
1、如果中间没有fflush、fseek、fsetpos、rewind,则在输出的后面不能直接跟随输入
2、如果中间没有fseek、fsetpos、rewind,或者一个输出操作没有到达文件尾端,则在输入操作之后不能直接跟随输出
int fclose(FILE *fp);//关闭一个打开的流

int getc(FILE *fp);//getchar 等价于getc(stdin)
int fgetc(FILE *fp);
int getchar(FILE *fp);
int ferror(FILE *fp); //出错检查
int feof(FILE *fp); //文件结束检查
int ungetc(int c, FILE *fp);//将字符压送回流中
压送回流中的字符以后可以从流中读出,但读出字符的顺序与压送回的顺序相反。不能回送EOF。一次成功的ungetc调用会清除该流的文件结束标志。(有时需要先看下一个字符,以决定如何处理当前字符时有用)
int putc(int c, FILE *fp);
int fputc(int c, FILE *fp);
int putchar(int c);
char * fgets(char *restrict buf, int n, FILE *restrict fp);//读取n-1个字符,自行添加NUL
char * gets(char *buf);
int fputs(const char *restrict str, FILE *restrict fp);
int puts(const char *str);

gets----------不保留换行符                                                      puts----------------添加换行符
fgets----------保留换行符                                                              fputs---------------不添加换行符

getc---------可实现为宏                                                             
so:getc的参数不应当时具有副作用的表达式。
fgetc--------一定时个函数
so:可得到其地址,fgetc的地址可做为参数。

EOF类型为int,所以单字符获取函数的返回值为int型,定义变量时要注意定义为int型,否则可能无法检测出EOF错误。

二进制IO( 前提
size_t fread(void *restrict ptr, size_t size, size_t nobj, FILE *restrict fp);
size_t fwrite(const void *restrict ptr, size_t size, size_t nobj, FILE *restrict fp);

定位流
long ftell(FILE *fp);
int fseek(FILE *fp, long offset, int whence);
void rewind(FILE *fp);
int fgetpos(FILE *restrict fp, fpos_t *restrict pos);
int fsetpos(FILE *fp, const fpos_t *pos);

pag121
格式化IO
int printf(const char *restrict format, ...);
int fprintf(FILE *restrict fp, const char *restrict format, ...);

int sprintf(char *restrict buf, const char *restrict format, ...);// 在尾端自动添加NUL,该字节不包括在返回值中
int snprintf(char *restrict buf, size_t n, const char *restrict format, ...);

转换说明:
%[flags][fldwidth][precision][lenmodifier]convtype
fldwidth:转换的最小字段宽度。如少则用空格填充。
precision:说明 整形转换后最少输出数字位数浮点数转换后小数点后的最少位数字符串转换后的最大字符数。精度是一个句点(.),后接一个可选非负十进制整数或一个星号。( 字符是限制,其他类型是规定最小标准)

int vprintf(const char *restrict format, va_list arg);
int vfprintf(FILE *restrict fp, const char *restrict format, va_list arg);
int vsprintf(char *restrict buf, const char *restrict format, va_list arg);
int vsnprintf(char *restrict buf, size_t n, const char *restrict format, va_list arg);

int scanf(const char *restrict format, ...);
int fscanf(FILE *restrict fp, const char *restrict format, ...);
int sscanf(const char *restrict buf, const char *restrict format, ...);

转换说明:
%[*][fldwidth][lenmodifier]convtype
fldwidth:最大宽度(最大字符数)

int scanf(const char *restrict format, va_list arg);
int vfscanf(FILE *restrict fp, const char *restrict format, va_list arg);
int vsscanf(char *restrict buf, const char *restrict format, va_list arg);

pag125
int fileno(FILE *fp); //获取与流相关连的文件描述符

临时文件
char * tmpnam(char *ptr);//产生一个与现有文件名不同的一个有效路径名字符串
FILE * tmpfile(void);//创建临时二进制文件,在关闭文件或程序结束时自动删除该文件
常用标准技术:先调用tmpnam产生一个唯一的路径名,然后用该路径名创建一个文件,并立即unlink它(链接计数为0)(关闭时引用计数为0,此时才删除其内容)
char * tempnam(const char *directory, const char *prefix);//为产生的路径名指定目录和前缀,prefix最多包含5个字符的字符串
按序判断:
1、如果定义了环境变量TMPDIR,则用其作为目录
2、如果参数directory非NULL,则用其作为目录
3、将中的字符串P_tmpdir用作目录
4、将本地目录(通常是/tmp)用作目录
int mkstemp(char *template);//创建临时文件,返回打开的文件描述符(不会自动删除,要调用unlink)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值