标准IO开发
前面分析的文件IO编程都是基于文件描述符的。这些都是基本的IO控制,是不带缓存的。
这里要讨论的IO操作是基于流缓冲的,它是符合ANSIC的标准IO处理。
标准IO提供流缓冲的目的是尽可能减少使用read和write调用的数量。标准IO提供了3种
类型的缓冲存储。
.全缓冲:当填满标准IO缓存后才进行实际IO操作。
.行缓冲:当在输入和输出中遇到新行符时,标准IO库执行IO操作。
.不带缓冲:标准IO库不对字符进行缓冲。如果用标准IO函数写若干字符到不带缓冲的流中,
则相当于用write系统函数将这些字符写全相比较的打开文件上。
1.fopen
#include
main()
{
FILE *fp;
int c;
if((fp=fopen("exist","w"))!=NULL)
{
printf("open success !");
}
fclose(fp);
}
/*----------------------------------------
notes:
1.fopen说明
打开文件有三个标准,分别为:fopen,fdopen和freopen.它们可以以不同的模式打开,
但都返回一个指向FILE的指针,该指针以将对应的IO流相绑定.此后,对文件的读写
都是通过这个FILE指针来进行.
2.fopen函数语法:
1)所需的头文件 #include2)函数原型:FILE *fopen(const char *path,const char *mode)
3)入口参数
path:包含要打开的文件路径及文件名
mode:文件打开状态
4)返回值
成功:指向FILE的指针
失败:NULL
3.mode 取值说明
r或rb 打开只读文件,该文件必须存在
r+或r+b 打开可读写的文件,该文件必须存在
w或wb 打开只写文件,若文件存在则文件长度清为0,即会擦除文件以前的
内容.若文件不存在则建立该文件
w+或w+b 打开可读写文件,若文件存在则文件长度清为0,即会擦除文件以前的
内容.若文件不存在则建立该文件
a或ab 以附加的方式打开只写文件.若文件不存在,则会建立该文件;如果文件
存在,写入的数据会被加到文件尾,即文件原先的内容会被保留
a+或a+b 以附加方式打开可读写的文件.若文件不存在,则会建立该文件;如果文件
存在,写入的数据会被加到文件尾后,即文件原先的内容会被保留.
4.在每个选项中加入b字符用来告诉函数库打开的文件为二进制文件,而非纯文字文件.不过在linux
系统中会自动识别不同类型的文件而将此符号忽略.
--------------------------------------------*/
2.fwrite
#include
int main()
{
FILE *stream;
unsigned char i,nmemb=3;
char s[3]={'a','b','c'};
stream=fopen("what","w");
i=fwrite(s,sizeof(char),nmemb,stream);
printf("i=%d",i);
fclose(stream);
}
/*---------------------------------
notes:
1.fwrite函数是用于对指定的文件流进行写操作.
2.fwrite函数格式
1)所需头文件:#include2)函数原型 size_t fwrite(const void *ptr,size_t size,size_t nnmemb,FILE *stream)
3)入口参数
ptr:存放写入记录的缓冲区
size:写入的记录大小
nmemb:写入的记录数
stream:要写入的文件流
4)函数返回值:
成功:返回实际写入到的nmemb数目
失败:EOF
---------------------------------------*/
3.fput
#includemain()
{
int c;
fputc(fgetc(stdin),stdout);
}
/*-----------------------------------------
文件在打开之后,根据一次读写文件中字符的数目可分为字符输入输出,行输入输出和
格式化输入输出.
一.字符输入输出
字符输入输出函数一次仅读写一个字符.
1.字符输出函数语法要点:
1)需头文件 #include2)函数原型
int getc(FILE *stream)
int fgetc(FILE *stream)
int getchar(void)
3)入口参数:
stream:要输入的文件流
4)函数返回值:
成功:下一个字符
失败:EOF
2.字符输入函数语法要点:
1)需头文件 #include2)函数原型
int putc(int c,FILE *stream)
int fputc(int c,FILE *stream)
int putchar(int c)
3)函数返回值
成功:字符c
失败:EOF
二.行输入输出
1.行输出函数语法要点
1)需头文件 #include2)函数原型
char *gets(char *s)
char fgets(char *s,int size,FILE *stream)
3)函数入口参数
s:要输入的字符串
size:输入的字符串长度
stream:对应的文件流
4)函数返回值
成功:s
失败:NULL
2.行输入函数语法要点
1)需头文件 #include2)函数原型
int puts(const char *s)
int fputs(const char *s, FILE *stream)
3)函数入口参数
s:要输出的字符串
stream:对应的文件流
4)函数返回值:
成功:s
失败:NULL
三:格式化输入输出
1.格式化输出函数1
1)需头文件 #include2)函数原型
int printf(const char *format,......)
int fprintf(FILE *fp,const char *format,......)
int sprintf(char *buf,const char *format,......)
3)函数入口参数
format:记录输出格式
fp:文件描述符
buf:记录输出缓冲区
4)函数返回值
成功:输出字符数(sprintf返回存入数组中的字符数)
失败:NULL
2.格式化输出函数2
1)需头文件
#include#include2)函数原型
int vprintf(const char *format,va_list arg)
int vfprintf(FILE *fp,const char *format,va_list arg)
int vsprintf(char *buf,const char *format,va_list arg)
3)函数入口参数
format:记录输出格式
fd:文件描述符
arg:相关命令参数
4)函数返回值
成功:存入数组的字符数
失败:NULL
3.格式化输入函数
1)需要的头文件
#include2)函数原型
int scanf(const char *format,......)
int fscanf(FILE *fp,const char *format,......)
int sscanf(char *buf,const char *format,......)
3)函数入口参数
format:记录输出格式
fp:文件描述符
buf:记录输入缓冲区
4)函数返回值
成功:输出字符数(sprintf返回存入数组中的字符数)
失败:NULL
----------------------------------------------*/