《UNIX环境高级编程》读书笔记之标准IO库(1)

来源:互联网 发布:淘宝网和京东哪个好 编辑:程序博客网 时间:2024/05/22 06:18

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时,可以使用此值将流重新定位到该位置。


0 0
原创粉丝点击