Chinaunix首页 | 论坛 | 博客
  • 博客访问: 61015
  • 博文数量: 26
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 255
  • 用 户 组: 普通用户
  • 注册时间: 2013-09-18 10:40
文章分类

全部博文(26)

文章存档

2013年(26)

我的朋友

分类: LINUX

2013-09-24 15:10:16

对于标准I/O库,所有操作围绕流(stream)来进行。而在第三章I/O函数都是针对文件的秒符符来,当打开一个文件,即返回一个文件描述符进行后续I/O操作。当用标准库打开I/O库创建一个文件时,我们已经使一个流和文件相关联。
#include
#include
int fwide(file *fp,int mode)//只有两个函数可以改变流的定向,freopen清除一个流的定向,fwide函数设置流的定向。
mode参数为负值:制定流是字节定向,为正:指定流是宽定向,为0:不设置流的定向,返回标识该流定向的值。不改变已经定向的流
file *为文件指针,file为一个结构,通常fopen()返回一个file对象指针。
三个标准I/O流通过预定义文件指针stdin ,stdout ,stderr加以引用
标注I/O库提供缓冲的目的是为了减少read() and write()的调用次数。
标准I/O提供三种类型的缓冲:
1)全缓冲:填满标准I/O缓冲区后才进行实际I/O操作。术语冲洗flush 说明标注I/O写操作。
2)行缓冲:当输入或者输出遇到换行符时,标准I/O库执行I/O操作。
3)不带缓冲:标准I/O库不对字符进行缓冲存储。
惯例:标准出错是不带缓冲的,打开至终端设备的流是行缓冲的,其他流则是全缓冲的


#incliude
void setbuf(FILE *restrict fp,char *restrict buf)//buf为NULL则关闭缓冲,可以设置缓冲区
int setvbuf(FILE *restrict fp,char *restrict bur,int mode,size_t size);//可以通过精确设置mode来设置缓冲类型:_IOFBF(全缓冲),_IOLBU(行缓冲),_IONBF(不带缓冲)。其中buf and size可以设置缓冲区以及大小。


#include
int fflush(FILE *FP)//任何时候调用此函数刷新缓冲区


#include
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 fields,const char *type);//用于由创建管道和网络通信通道的函数返回的描述符,因为这些类型的文件不能由fopen打开,所以需要事先获得一个文件描述符,再用fdopen使一个标准I/O流与该文件描述符相关联。
type参数指定对该I/O流的读,写方式。
r/rb 读而打开 ;
w/wb 把文件截短为0或者为写打开; 
a/ab 添加,为文件尾写而打开或为写而创建
r+或rb+ 为读和写而打开
w+或wb+ 把文件截短至0,或为读和写打开
a+或ab+ 为文件尾读和写而打开或者创建 


#include
int fclose(FILE* fp)//关闭一个流


一旦打开一个流,可以在三种不同类型的非格式化I/O中进行读写选择(格式化I/O为printf and scanf)
1)每次一个字符
2)每次一行的I/O;fgets() and fputs()
3)直接I/O;fread() and fwrite(),每次读写某种数量的对象,每个对象指定长度。


每次读一个字符,输入函数
#include
int getc(FILE *fp);//可以实现为宏
int fgetc(FILE *fp);//不可以实现为宏
int getchar(void);//等效与getc(stdin)


#include
int ungetc(int c,FILE *fp);//在流中读取数据以后,可以调用ungetc将字符再压送回流中。
输出函数:
int puts(FILE *fp);
int fputs(FILE *fp);
int putchar(int c);//等效与ptus(c,stdout)


每次一行I/O
#include
char *fgets(char *restrict buf,int n,FILE *restrict fp);//指定的流读,缓冲区以NULL结尾,最多读入N-1个字符
char *gets(char *buf);//标准输入读


gets不把换行符输入缓冲区,fgets会吸收换行符进入缓冲区


#include
int fputs(const char *restrict str,FILE* restrict fp)//将一个以NULL为终止符的字符串写道指定的流,尾端终止符NULL不输出。
int puts(const char *str);//自动将一个换行符写到标准输出
fgets and fputs 需要自己处理换行符.


一次读或写整个结构,fputs遇到NULL字节时会停止,fgets遇到输入数据包含NULL或换行符则不能正确工作。二进制I/O
#include
size_t fread(void *restrict ptr,size_t size,size_t nobj,FILE *restrict fp);//ptr指起始地址,size为单个结构大小,nobj指多少个这样的结构,fp读的流
size_t fwrite(const void*restrict ptr,size_t size,size_t nobj, FILE *restrict fp);


定位I/O流
int fgetpos(FILE *restrict fp,fpos_t *restrict pos);//将文件位置指示器的当前值存入由POS指向的对象中,在以后调用fsetpos时,可以使用此值将流重定位至该位置。
int fsetpos(FILE *fp,const fpos_t *pos);


格式化输出处理的4个函数
int printf()//将格式化数据写到标准输出
int fprintf(FILE* restrict fp,..)//写到指定的流
int sprintf(char * buff,..)//将格式化的字符送入数组,尾部自动加入NULL字节,返回值中不包括该字节
int snprintf(char *buff,size_t n,...)//需要指定缓冲区大小,多余都被丢弃


格式化输入三个scanf函数
#include
int scanf(..);//
int fscanf(FILE *restrict fp,...)
int sscanf(const char *restrict buf,...)


根据流FILE* 结构可以获得相应的文件描述符
#include
int fileno(FILE* fp)//如果调用dup或者fcntl等函数,则需要此函数

阅读(629) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~