1.对于ACSii字符集,一个字符用一个字节表示。对于国际字符集,一个字符需要由多个字符表示。标准I/O文件流可以用于单字节或多字节字符集。流的定向决定了所读写的字符是单字节的还是多字节的。只有两个函数可以改变流的定向。freopen()函数清除一个流的定向;fwide()函数可用于设置流的定向。
#include <stdio.h>
#include <wchar.h>
int fwide(FILE * fp,int mode);
根据mode值的不同,fwide()函数执行不同的操作。
(1)若mode为负数,fwide()函数试图使指定的流是字节定向的。
(2)若mode为正数,fwide()函数试图使指定的流是宽定向的。
(3)若mode为零,fwide()函数不改变流的定向,但返回表示该流定向的值。
2.缓冲类型
(1)全缓冲:在这种情况下,在填满标准I/O缓冲区后才进行实际的I/O操作。
(2)行缓冲:在这种情况下,当在输入和输出遇到换行符时,标准I/O库执行I/O操作。当流涉及到一个终端时,通常使用行缓冲。
(3)不带缓冲:标准I/O库不对字符进行缓冲存储。标准错误流通常就是不带缓冲的,这就使得错误信息尽快的显示出来。
对于任何一个给定的流,我们如果不喜欢系统默认的缓冲类型,则可以通过下列函数更改缓冲类型:
#include <stdio.h>
void setbuf(FILE *restrict fp,char *restrict buf);
int setvbuf(FILE *restrict fp,char *restrict buf,int mode,size_t size);
setbuf函数打开或关闭缓冲机制。打开缓冲机制时,buf指向一个长度为BUFSIZE的缓冲区,通常在此之后该流就是全缓冲的。如果该流与终端设变相关,那么某些系统也可将其设置为行缓冲的。
要关闭缓冲的话,就要将buf设置为NULL。
通过setvbuf,我们可以精确地说明所需缓冲的类型。当参数mode设置为_IOFBF时,可以将流设置为全缓冲的。当mode设置为_IOLBF时,可以将流设置为行缓冲的。当mode设置为_IONBF时,可以将流设置为不带缓冲的。
3.打开流
#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 fd,const char * type);
freopen函数在一个指定的流上打开一个指定的文件,若该流已经打开,则先关闭该流。此函数一般用于将一个指定的文件打开为一个预定义的流:标准输入,标准输出,标准出错。
type参数指定对该I/O流的读写方式。ISO C规定type可以有15种不同的值。如下图:
关闭一个文件:
#include <stdio.h>
int close(FILE *fp);//成功返回0,错误返回EOF。
4.读和写流
输入函数:
#include <stdio.h>
int getc(FILE *fp);
int fgetc(FILE *fp);
int getchar(void);//getchar()相当于个停车(stdin)。若成功,返回下一个字符;若已达到文件尾或出错,则返回EOF。要区分这两种情况,必须调用ferror()和feof。
#include <stdio.h>
int ferror(FILE *fp);
int feof(FILE *fp);//若条件为真,则返回非零;否则返回零。
void clearerr(FILE *fp);
在大多数实现中,为每个流在FILE中维护两个标志位:
(1)出错标志。
(2)文件结束标志。
用clearerr()函数可以清除这两个标志位。
输出函数:
#include <stdio.h>
int putc(int c,FILE *fp);
int fputc(int c,FILE *fp);
int putchar(int c);
5.每次一行I/O
#include <stdio.h>
char *fgets(char * restrict buf,int n,FILE * restrict fp);
char *gets(char * buf);//没有指定缓冲区的长度,有可能造成溢出,建议少用
int fputs(const char *restrict str,FILE *restrict fp);
int puts(const char * str);
6.对流进行定位
#include <stdio.h>
long ftell(FILE *fp);//若成功,返回当前文件位置指示;若出错,返回-1
int fseek(FILE *fp,long off_set,int whence);//whence与lseek中whence的取值相同
size_t ftello(FILE *fp);
int fseeko(FILE *fp,off_t offset,int whence);
除了偏移量类型为off_t外,其他的与ftell与fseek相同。
int fgetpos(FILE *restrict fp,fpos_t * restrict fp);
int fsetpos(FILE *fp,fpos_t * fp);
fgetpos将文件位置指示器的当前值存在由pos指向的对象中。在以后调用fsetpos时,可以使用此值将流重新定位到该位置。