标准I/O库
Posted lnlin
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了标准I/O库相关的知识,希望对你有一定的参考价值。
设置流的定向:
#include <stdio.h> #include <wchar.h> // 流的定向决定了所读、写的字符是单字节(字节定向)还是多字节的(宽定向) // 若流是宽定向的返回正值,若流是字节定向的返回负值,若流未定向,返回0 int fwide(FILE *fp, int mode); // fp: 与要被设置流的定向的文件相关的流 // mode取值决定fwide()如何工作: // mode为正,指定为宽定向;mode为负,指定为字节定向;mode为0,不做任何设置,仅仅返回标识该流的定向
缓冲区操作:
缓冲类型:
全缓冲:在填满I/O缓冲区后才进行实际的I/O操作
行缓冲:在I/O中遇到换行符时,标准I/O库才执行I/O操作
行缓冲的限制是无法得知在执行实际的I/O操作时是因为换行符还是其他原因
不带缓冲:标准I/O库不对字符进行缓冲存储
ISO C要求的缓冲特征:
仅当标准输入和标准输出并不指向交互式设备时,他们才是全缓冲
标准错误不会是全缓冲
一般情况下,标准错误不带缓冲,指向终端的流为行缓冲,其他为全缓冲
#include <stdio.h> // 成功返回0,出错返回-1 void setbuf(FILE *fp, char *buf); // fp是一个打开着的,与将被操作的文件相关的流 // buf指向一个长度为BUFSIZ的缓冲区或者为NULL // 当buf为NULL时表示关闭缓冲机制 // 当buf不为NULL时,表示打开缓冲机制,但具体是何种缓冲取与fp相关 void setvbuf(FILE *fp, char *buf, int mode, size_t size); // setvbuf()可以精确设置所需的缓冲类型 // mode为 _IOFBF为全缓冲 // mode为 _IOLBF为行缓冲 // mode为 _IONBF为不带缓冲,此时忽略buf和size参数 // buf和size用于指定一个缓冲区及其长度 // 若buf为NULL,但该流带缓冲,则缓冲区由标准I/O库分配,长度为BUFSIZ // 强制冲洗一个缓冲区 int fflush(FILE *fp);
流的打开与关闭:
#include <stdio.h> // 成功返回文件指针,出错返回NULL FILE *fopen(const char *path, const char *type); // path指定被打开的文件路径 // type指定对该I/O流的读写方式 FILE *freopen(const char *path, const char *type, FILE *fp); // 在一个指定的流(fp)上打开一个文件,若该流已经打开,则先关闭该流,若该流已经定向,则清除该定向 FILE *fdopen(int fd, const char *type); // 为一个现有的文件描述符(fd)打开一个相关的流,一般用于那写无法用fopen()打开的特殊文件 // 成功返回0,出错返回EOF int fclose(FILE *fp); // 关闭一个打开着的流
对流进行读写:
#include <stdio.h> // 一次读取一个字符 // 成功返回下一个字符,出错或到达文件尾端,返回EOF int getc(FILE *fp); int fgetc(FILE *fp); int getchar(); // 关于返回值问题: // 由于在<stdio.h>中的常量EOF被要求是一个负值,且其值经常为-1,不论是出错还是到达文件 // 尾端,他们的返回值都一样,所以为了区分这两种情况,必须调用ferror()、feof() // 将一个字符压送回流缓冲区 // 成功返回c,出错返回EOF int ungetc(int c, FILE (fp); // 向指定流写入一个字符 // 成功返回c,出错返回EOF int putc(int c, FILE *fp); int fputc(int c, FILE *fp); int putchar(int c); // 每次从指定流读取一行 // 成功返回buf,出错返回NULL char *fgets(char *buf, int n, FILE *fp); // n为buf长度 char *gets(char *buf); // 弃用,可能造成缓冲区溢出 // 向指定流输出一行 // 成功返回非负值,出错返回EOF int fputs(const char *str, FILE *fp); int puts(const char *str); // 二进制I/O: // 返回读、写的对象数 size_t fread(void *ptr, size_t size, size_t nobj, FILE *fp); size_t fwrite(const void *ptr, size_t size, size_t nobj, FILE *fp); // nobj 为将被读写的对象个数
对流进行定位:
#include <stdio.h> // 成功返回当前文件位置,出错返回-1 long ftell(FILE *fp); off_t ftello(FILE *fp); // 设置文件偏移量 // 成功返回0,出错返回-1 int fseek(FILE *fp, long offset, int whence); int fseeko(FILE *fp, off_t offset, int whence); void rewind(FILE *fp); // 获取、设置文件位置 // 成功返回0,出错返回-1 int fgetpos(FILE *fp, fpos_t *pos); int fsetpos(FILE *fp, fpos_t *pos); // pos用于存放文件位置指示器的值
创建临时文件:
#include <stdio.h> // 返回指向唯一路径名的指针 char *tmpnam(char *ptr); // ptr为NULL时,该路径名存放在一个静态区中 // ptr不为NULL时,则认为它是指向长度至少是L_tmpnam个字符的数组 // 一般在程序中使用时,使用tmpnam()返回的路径值创建一个文件,并对它使用unlink() // 创建一个临时二进制文件,在关闭该文件或程序结束时自动删除此文件 // 成功返回文件指针,出错返回NULL FILE *tmpfile(void); // SUS为处理临时文件定义的函数 #include <stdlib.h> // 成功返回指向目录名的指针,出错返回NULL char *mkdtemp(char *template); // 成功返回文件描述符,出错返回-1 int mkstemp(char *template); // 名字是通过template字符串选择的,template是的后6位被设置为XXXXXX路径名
内存流:
#include <stdio.h> #include <wchar.h> // 打开一个内存流 // 成功返回流指针,出错返回NULL FILE *fmemopen(void *buf, size_t size, const chat *type); // buf指向缓冲区开始位置,size指定缓冲区大小,type指定如何使用流,类似用打开文件时的type FILE *open_memstream(char **bufp, size_t *sizep); // 创建的流面向字节的 FILE *open_wmemstream(wchar_t **bufp, size_t *sizep); // 创建的流面向宽字节 // 通过bufp、sizep返回缓冲区地址和大小 // 限制:创建的流只能打开,且不能自己指定缓冲区,关闭流后需要自行释放缓冲区,对流添加字节会增加缓冲区大小
以上是关于标准I/O库的主要内容,如果未能解决你的问题,请参考以下文章