您的位置:首页 > 运维架构 > Linux

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

2013-08-21 18:41 190 查看
在上一篇文章中已经说了不少文件操作,那些大多数都是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函数
*/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息