I/O库提供缓冲的目的的目标是尽可能的减少调用read函数和write函数的次数,同时也对每个I/O流自动进行缓冲管理。
1.全缓冲
只有填满缓冲区才会实施I/O操作
2.行缓冲
在输入或输出时遇到换行符执行I/O操作
3.不带缓冲
不对字符执行缓冲操作。
术语“冲洗”用于说明缓冲区的写操作。
缓冲区可自动冲洗,也可调用fflush函数冲洗一个流。
在UNIX环境中,冲洗有两种意思:
1.在标准I/O库方面,表示将缓冲区内容写到磁盘上
2.在终端驱动程序方面,表示丢弃已存储在缓冲区上数据
主要有fopen、fclose、fread、fwrite、fprintf、fscanf等函数。
(1)fopen函数——用于打开文件
表头文件: #include
定义函数: FILE * fopen(const char * path,const char * mode);
函数说明: 参数path字符串包含欲打开的文件路径及文件名,参数mode字符串则代表着流形态,mode有下列几种字符串。
R:打开只读文件,该文件必须存在。
r+:打开可读写的文件,该文件必须存在。
w:打开只写文件,若文件存在则文件长度清0,即该文件内容会消失;若文件不存在则建立该文件
w+:打开可读写文件,若文件存在则文件长度清0,即该文件内容会消失;若文件不存在则建立该文件。
a:以附加的方式打开只写文件,若文件不存在,则会建立该文件;如果文件存在,写入的数据会被加到文件尾,即文件原先的内容会被保留。
a+:以附加方式打开可读写的文件,若文件不存在,则会建立该文件;如果文件存在,写入的数据会被加到文件尾后,即文件原先的内容会被保留。
上述的字符串都可以再加一个b字符,如rb、w+b或ab+等组合,加入b字符用来告诉函数库打开的文件为二进制文件,而非纯文字文件。不过在POSIX系统,包含Linux都会忽略该字符。
由fopen( )所建立的新文件会具有S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH(0666)权限,此文件权限也会参考umask值
返回值 : 文件顺利打开后,指向该流的文件指针就会被返回;若文件打开失败,则返回NULL,并把错误代码存在errno中。
(2)fclose函数:——用于关闭文件
表头文件:#include
定义函数:int fclose(FILE * stream);
函数说明: fclose( )用来关闭先前fopen( )打开的文件,此动作会让缓冲区内的数据写入文件中,并释放系统所提供的文件资源
返回值: 若关文件动作成功则返回0;有错误发生时则返回EOF并把错误代码存到errno。
(3)fdopen函数:——用于将文件描述词转为文件指针
表头文件:#include
定义函数:FILE * fdopen(int fildes,const char *mode);
函数说明:fdopen( )会将参数fildes的文件描述词转换为对应的文件指针后返回,参数mode字符串则表示文件指针的流形态,此形态必须与原文件描述词读写模式相同。
返回值: 转换成功,则返回指向该流的文件指针;若失败,则返回NULL,并把错误代码存在errno中。
(4)fread函数:——用于从文件读取数据
表头文件:#include
定义函数:size_t fread(void * ptr,size_t size,size_t nmemb,FILE * stream);
函数说明:fread( )用来从文件流中读取数据。参数stream为已打开的文件指针,参数ptr指向欲存放读取进来的数据空间,读取的字符数由参数nmemb来决定。fread( )会返回实际读取到的nmemb数目,如果此值比参数nmemb小,则代表可能读到了文件尾或有错误发生,这时必须用feof( )或ferror( )来判定发生什么情况
返回值:返回实际读取到的nmemb数目
(5)fwrite函数:——用于将数据写入文件流
表头文件: #include
定义函数:size_t fread(void * ptr,size_t size,size_t nmemb,FILE * stream);
函数说明: fread( )用来从文件流中读取数据。参数stream为已打开的文件指针,参数ptr指向欲存放读取进来的数据空间,读取的字符数由参数size*nmemb来决定。fread( )会返回实际读取到的nmemb数目,如果此值比参数nmemb小,则代表可能读到了文件尾或有错误发生,这时必须用feof( )或ferror( )来判定发生什么情况
返回值:返回实际读取到的nmemb数目
(6)fseek函数:——用于移动文件流的读写位置
表头文件:#include
定义函数: int fseek(FILE * stream,long offset,int whence);
函数说明: fseek( )用来移动文件流的读写位置。参数stream为已打开的文件指针,参数offset为根据参数whence来移动读写位置的位移数。参数whence为下列其中一种:SEEK_SET从距文件开头offset位移量为新的读写位置;SEEK_CUR以目前的读写位置往后增加offset个位移量;SEEK_END将读写位置指向文件尾后再增加offset个位移量。
当whence值为SEEK_CUR或SEEK_END时,参数offset允许负值的出现。
下列是较特别的使用方式:
欲将读写位置移动到文件开头时,fseek(FILE * stream,0,SEEK_SET);
欲将读写位置移动到文件尾时,fseek(FILE * stream,0,0SEEK_END);
返回值: 当调用成功时则返回0;若有错误则返回-1,errno会存放错误代码。
(7)fgetc函数:——用于从文件读取一个字符
表头文件: #include
定义函数 :int fgetc(FILE * stream);
函数说明 :fgetc( )用来从参数stream所指的文件中读取一个字符;若读到文件尾而无数据时便返回EOF
返回值 :fgetc( )会返回读取到的字符;若返回EOF则表示到了文件尾
getc函数:——用于从文件中读取一个字符
表头文件 : #include
定义函数 : int getc(FILE * stream);
函数说明 : getc( )用来从参数stream所指的文件中读取一个字符;若读到文件尾而无数据时便返回EOF。虽然getc( )与fgetc( )作用相同,但getc( )为宏定义,非真正的函数调用
返回值 : getc( )会返回读取到的字符;若返回EOF则表示到了文件尾
getchar函数:——用于从标准输入设备中读取一个字符
表头文件: #include
定义函数 :int getchar(void);
函数说明: getchar( )用来从标准输入设备中读取一个字符;然后将该字符从unsigned char转换成int后返回
返回值 :getchar( )会返回读取到的字符;若返回EOF则表示有错误发生
(8)fputc函数:——用于将一指定字符写入文件流
表头文件:#include
定义函数:int fputc(int c,FILE * stream);
函数说明:fputc将参数c转为unsigned char后写入参数stream指定的文件中
返回值: fputc( )返回写入成功的字符,即参数c;若返回EOF则代表写入失败
putc函数:——用于将一指定字符写入文件
表头文件:#include
定义函数 : int putc(int c,FILE * stream);
函数说明 : putc( )将参数c转为unsigned char后写入参数stream指定的文件中。虽然putc( )与fputc( )作用相同,但putc( )为宏定义,非真正的函数调用
返回值: putc( )返回写入成功的字符,即参数c;若返回EOF则代表写入失败
putchar函数:——用于将指定字符写入标准输出设备
表头文件:#include
定义函数:int putchar (int c);
函数说明:putchar( )用来将参数c字符写到标准输出设备
返回值:putchar( )返回输出成功的字符,即参数c;若返回EOF则代表输出失败
(9)fprintf函数:——用于格式化输出数据至文件
表头文件:#include
定义函数: int fprintf(FILE * stream, const char * format,……);
函数说明: fprintf( )会根据参数format字符串来转换并格式化数据,然后将结果输出到参数stream指定的文件中,直到出现字符串结束(\0)为止
返回值:关于参数format字符串的格式请参考printf( )。成功则返回实际输出的字符数,失败则返回-1,错误原因存于errno中