Linux系统编程学习之《标准I/O操作》

在上一篇文章中已经说了不少文件操作,那些大多数都是POSIX标准上的操作

今天我来总结一下ISO-C标准的标准I/O库函数及操作

标准I/O文件可用于单字节或多字节(“宽”)字符集。流的定向决定了所读、写的字符是单字节还是多字节的。

一个流最初被创建时,它没有定向

如果要在未定向的流上使用一个多字节I/O函数,则将该流的定向设置为宽定向的

如果在未定向的流上使用一个单字节I/O函数,则将该流的定向设置为字节定向的

有两个函数可以改变流的定向

freopen函数清楚一个流的定向,fwide函数设置流的定向

1.fwide函数

/*
 * #include <stdio.h>
 * #include <wchar.h>
 * int fwide(FILE * fp,int mode);
 * 若流是宽定向的则返回正值,若流是字节定向的则返回负值,若流是未定向的则返回0
 * 如果mode为负,fwide试图使指定的流是字节定向的
 * 如果mode为正,fwide试图使指定的流是宽定向的
 * 如果mode为0,fwide不试图使设置指定的流的定向,但返回标志流定向的值
 * 注意,fwide并不能改变已定向流的定向
 */

2.setbuf和setvbuf函数

/*
 * #include <stdio.h>
 * void setbuf(FILE * restrict fp,char * restrict buf);
 * int setvbuf(FILE * restrict fp,char * restrict buf,int mode,size_t size);
 * 成功返回0,出错返回非0值
 * 两个函数用于打开或关闭缓冲机制
 * ----------------------------------------------
 * setbuf中,如buf非空,则必须指定一个长度为BUFSIZE的用户buf,BUFSIZE在<stdio.h>中电工已,此时缓冲类型为全缓冲或行缓冲
 * 如果buf为NULL,则不设置缓冲区,没有缓冲机制
 * ----------------------------------------------
 * setvbuf中,若mode为_IOFBF则采用全缓冲,而且
 * buf非空,设置长度为size的用户buf
 * buf为NULL,设置长度适合的系统缓冲区
 * 若mode为_IOLBF则采用行缓冲,而且
 * buf非空,设置长度为size的用户buf
 * buf为NULL,设置长度适合的系统缓冲区
 * 若mode为_IONBF,则不设置缓冲区,也不带缓冲
 */

3.fflush函数

/*
 * #include <stdio.h>
 * int fflush(FILE * fp);
 * 成功返回0,出错返回EOF
 * 把一个指定输出流的数据写回磁盘
 * 如果fp是NULL,则所有输出流的数据被冲洗
 */

4.fopen、freopen和fdopen函数

/*
 * #include <stdio.h>
 * FILE * fopen(const char * restrict pathname,const char * restrict type);
 * FILE * freopen(const char * restrict pathname,const char * restrict type,FILE * restrict fp);
 * FILE * fdopen(int filedes,const char * type);
 * 三个函数成功返回文件指针,出错返回NULL
 * 这三个函数都是用于打开一个标准I/O流
 * fopen打开一个指定的文件
 * freopen打开指定的流定向到指定文件,如果流已经打开,则先关闭流,
 * 如果流已定向,则freopen会清除该定向,一般用于打开标准输入、输出、错误输出等流对象
 * fdopen用于获取一个现有文件描述符,并使一个标准的I/O流与该描述符相结合
 * type类型有如下可选
 * r或rb 只读打开(加上b是指以二进制文件读取,否则以文本文件读取(加t),默认以文本文件读取,下同)
 * w或wb 把文件截短至0长,或为写而创建
 * a或ab 添加,为在文件尾写而打开,或为写而创建
 * r+或r+b或rb+ 读写打开
 * w+或w+b或wb+ 把文件截短为0,或读写打开
 * a+或a+b或ab+ 为在文件尾读和写而打开或创建
 * ---------------------------------------------
 * 至于当type中有+时,具有如下限制:
 * 如果中间没有fflush、fseek、fsetpos或rewind,则在输出的后面不能直接跟输入
 * 如果中间没有fseek、fsetpos或rewind,或者一个输入操作没有到达文件尾端,则在输入操作之后不能直接跟随输出
 * ---------------------------------------------
 * 如果喜欢改变流定向,则应该在打开流后,操作之前,用setbuf或setvbuf改变缓冲的类型和定向
 */

5.fclose函数

/*
 * #include <stdio.h>
 * int fclose(FILE * fp);
 * 成功返回0,出错返回EOF
 * 用于关闭一个流,关闭前会把缓冲区的数据全写入硬盘
 */

6.读和写流I/O函数

/*
 * #include <stdio.h>
 * int gec(FILE * fp);
 * int fgetc(FILE * fp);
 * int getchar(void);
 * -------------------------------------------------
 * 三个函数成功返回下一个字符,出错或达到文件结尾返回EOF
 * getchar等价于getc(stdin);getc可被实现为宏,fgetc不能。
 * -------------------------------------------------
 * int ferror(FILE * fp);
 * int feof(FILE * fp);
 * void clearerr(FILE * fp);
 * -------------------------------------------------
 * 前两个函数成功返回非0,否则返回0
 * clearerr用于清除出错标志和文件结束标志
 * -------------------------------------------------
 * int ungetc(int c,FILE * fp);
 * -------------------------------------------------
 * 成功返回c,出错返回EOF
 * 用于将字符在压送回流中,一次压一个,压送的字符不一定是上一次读到的字符
 * 读处字符的顺序与压送回的顺序相反
 * -------------------------------------------------
 * int putc(int c,FILE * fp);
 * int fputc(int c,FILE * fp);
 * int putchar(int c);
 * -------------------------------------------------
 * putchar(c)等价于putc(c,stdout)
 * putc可以实现宏,fputc不可以
 * -------------------------------------------------
 */

7.行操作I/O函数

/*
 * #include <stdio.h>
 * char * fgets(char * restrict buf,int n,FILE * restrict fp);
 * char * gets(char * buf);
 * ------------------------------------------------
 * 两个函数成功返回buf,达到文件末尾或出错返回NULL
 * gets从标准输入读;fgets从指定流读,而且需指定缓冲区最大值
 * 读入的数据中,gets删除换行符,fgets包含换行符
 * ------------------------------------------------
 * int fputs(const char * restrict str,FILE * restrict fp);
 * int puts(const char * str);
 * ------------------------------------------------
 * 成功返回非负值,出错返回EOF
 * ------------------------------------------------
 */

8.二进制I/O函数

/*
 * #include <stdio.h>
 * 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);
 * 两个函数返回读或写的字节数
 */

9.定位流

/*
 * #include <stdio.h>
 * long ftell(FILE * fp);   //成功返回文件当前位置,出错返回-1L
 * int fseek(FILE * fp,long offset,int whence);  //成功返回0,出错返回非0值
 * void rewind(FILE * fp);   //重置文件位置到开始位置
 * off_t ftello(FILE * fp);  //成功返回文件当前位置,出错返回-1
 * int fseeko(FILE * fp,off_t offset,int whence); //成功返回0,出错返回非0值
 * int fgetpos(FILE * restrict fp,fpos_t restrict pos);
 * int fsetpos(FILE * fp,const fpos_t * pos);
 * ----------------------------------------------------
 * 两个函数成功返回0,出错返回非0值
 * 把取得文件位置的信息保存到pos指向的对象中
 * 把要设置文件的位置信息保存到pos对象中再设置
 */

10.格式化I/O

/*
 * #include <stdio.h>
 * int printf(const char * restrict format, ...);
 * int fprintf(FILE * restrict fp,const char * restrict format, ...);
 * ----------------------------------------
 * 两个函数成功返回输出的字符数,出错返回负数
 * 用与把字符输出到标准输出中
 * ----------------------------------------
 * int sprintf(char * restrict buf,const char * restrict format, ...);
 * int snprintf(char * restrict buf,size_t n,const char * restrict format, ...);
 * ----------------------------------------
 * 两个函数成功返回存入数组的字符数,若编码出错则返回负值
 * 用于把字符输出到指定缓冲区中
 * ----------------------------------------
 * 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, ...);
 * ----------------------------------------
 * 三个函数成功返回指定输入项数,若输入出错或在任意变换前已到达文件结尾则返回EOF
 * 若有一个字符不匹配,则停止后续处理,不再读输入的其余部分
 */

11.格式化I/O-2

/*
 * #include <stdio.h>
 * #include <stdarg.h>
 * 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 vscanf(const char * restrict format,va_list arg);
 * int vfscanf(FILE * restrict fp,const char * restrict format,va_list arg);
 * int vsscanf(const char * restrict buf,const char * restrict format,va_list arg);
 * ----------------------------------------
 * 三个函数返回指定的输入项数
 * 若输入出错或在任已变换前已到达文件结尾返回EOF
 */

12.fileno函数

/*
 * #include <stdio.h>
 * int fileno(FILE * fp);
 * 返回与该流相关联的文件描述符
 * 此函数不是ISO-C标准,是POSIX支持的扩展
 */

13.临时文件

/*
 * #include <stdio.h>
 * char * tmpnam(char * ptr);  //返回指向唯一路径名的指针
 * FILE * tmpfile(void);  //成功返回文件指针,出错返回NULL
 * char * tempnam(const char * directory,const char * prefix); //返回指向唯一路径名的指针
 * --------------------------------------------
 * tempnam函数有如下四个判断条件,并使用第一个为真的作为目录
 * 1.如果定义了环境变量TMPDIR,则用其作为目录
 * 2.如果参数directory非NULL,则用其作为目录
 * 3.将<stdio.h>中的字符串P_tmpdir用作目录
 * 4.将本地目录(通常是/tmp)用作目录
 * 如果prefix非NULL,则它应该是最多包含5个字符的字符串,用其作为文件名的头几个字符
 * --------------------------------------------
 */

14.mkstemp函数

/*
 * #include <stdlib.h>
 * int mkstemp(char * template);
 * 成功返回文件描述符,出错返回-1
 * 返回的文件描述符可用于读、写
 * 该函数创建的临时文件不会自动被删除,需要用unlink函数
 */

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值