函数
mode
buf
缓冲区长度
缓冲类型
setbuf
非空
长度为BUFSIZ的BUF
全缓冲,行缓冲
NULL
无缓冲区
不带缓冲
setvbuf
IOFBF
非空
长度为size的buf
全缓冲
NULL
合适长度的系统缓冲区
IOLBF
非空
长度为size的buf
行缓冲
NULL
合适长度的系统缓冲区
IONBF
无缓冲区
不带缓冲
#include <stdio.h>
#include <stddef.h>
#include <string.h>
int main() {
FILE * iostream = fopen("fopenfile", "w+");
if (iostream == NULL) {
perror("流打開錯誤");
return -1;
}
setvbuf(iostream, NULL, _IOFBF, BUFSIZ); //1
char *buf = "abcde"; //2
int size = fwrite(buf, sizeof(char), strlen(buf)+1 ,iostream);
printf("寫入的數據是:%s", buf);
fflush(iostream); //3
sleep(-1);
return 1;
}
针对上述代码做如下分析:
将3处进行注释,并执行
fopenfile文件无任何内容,因此现在数据都在缓冲区,由于进程SLEEP流未关闭,并且缓冲区也没有写满,因此不会执行IO操作
不注释任何内容,并执行
fopenfile文件内容为abcde,由于fflush冲洗将缓冲区数据写入文件
将1处缓冲模式改为_IOLBF,注释3处,并执行
fopenfile文件无任何内容,虽然指定了行缓冲但是没有行结束符,因此数据在缓冲区内,没有进行IO操作
将1处缓冲模式改为_IOLBF,注释3处,并将2处数据改为buf=”abcde\n” ,执行
fopenfile文件内容为abcde,由于设置行行缓冲,并且存在结束符,因此进行了IO操作
将1处缓冲模式改为_IONBF,注释3处,并执行
fopenfile文件内容为abcde,由于设置无缓冲,因此每次写入都会进行IO操作
主要函数
打开关闭流
打开一个指定的文件
FILE *fopen (constchar *__restrict __filename,
constchar *__restrict __modes)
通过文件描述符打开一个指定的文件
FILE *fdopen (int __fd, constchar *__modes)
modes:打开模式
R或rb
为读而打开
W或wb
把文件截断为0长,或为写而创建
A或ab
添加;在文件尾为写而打开,或为写而创建
R+
为读和写而打开
W+
把文件截断为0长,或为为读和写而打开
A+
为在文件尾为写而打开或创建
关闭文件流
intfclose (FILE *__stream);
单字符读写
读函数
int fgetc (FILE *__stream);
int getc (FILE *__stream);
int getchar (void);
fgetc是一个函数,getc可实现为宏,getchar为从标准输出流中获取一个字符,相当于getc(stdin)
返回值:若成功则返回读取到的字符,若失败或读到文件尾则返回-1
由于无论失败或者读到文件尾都返回-1,为了区分哪种原因返回的-1。提供下面2个函数
以读到文件结尾返回
int feof (FILE *__stream)
以产生错误返回返回
int ferror (FILE *__stream)
返回值:条件为真返回非0.条件为假返回0
写函数
int fputc(int __c, FILE *__stream);
int putc (int __c, FILE *__stream);
int putchar (int __c);
返回值:成功返回c,失败返回EOF
举例: