FILE *fopen(const char *path, const char *mode);
mode:
r: 以读的方式打开文件,同时流指针指向文件开头
r+: 以读写的方式打开文件,同时流指针指向文件开头
w: 以写的方式打开文件,如果文件存在,清空,否则
创建文件,文件的流指针在文件开头
w+: 以读写的方式打开文件,如果文件存在,清空,否则
创建文件,文件的流指针在文件开头
a: 以写的方式打开文件,如果文件不存在创建文件,
否则,以追加方式写,文件的流指针在文件结尾
a+: 以读写方式打开,如果文件不存在创建文件,否则
读流指针在文件开头,以追加方式写,流指针在文件的
结尾
#include <stdio.h>
FILE指针:每个被使用的文件都在内存中开辟一个区域,
用来存放文件的有关信息,这些信息是保存在一个结构
体类型的变量中,该结构体类型是由系统定义的,取名
为FILE。
标准I/O库的所有操作都是围绕流(stream)来进行的,
在标准I/O中,流用FILE *来描述。
流(stream)
定义:所有的I/O操作仅是简单的从程序移进或者移出,
这种字节流,就称为流。
分类:文本流/二进制流。
typedef struct _IO_FILE FILE
struct _IO_FILE {
int _flags;
char* _IO_buf_base;
char* _IO_buf_end;
...
int _fileno;
};
系统在执行程序的时候,会默认打开3个流:
标准输入 ---> stdin
标准输出 ---> stdout
标准错误 ---> stderr
缓存区:
全缓存:对普通文件操作(fopen打开后,返回的流指针FILE *)
大小为4KB缓存区
完成缓存区数据刷新条件:
1. 缓存区满
2. 强制刷新 --->>> fflush();
int fflush(FILE *stream);
3.文件关闭的时候刷新缓存区
行缓存:对终端进行的操作(标准输入,标准输出)
大小为1KB缓存区
完成缓存区数据刷新条件:
1. 缓存区满
2. 强制刷新 --->>> fflush();
3. 遇到'\n'
4. 程序正常退出的时候return
5. 调用exit退出的时候
无缓存:大小0,标准错误
perror
void perror(const char *s);
fprintf
int fprintf(FILE *stream, const char *format, ...);
sprintf
int sprintf(char *str, const char *format, ...);
#include <stdio.h>
int main(int argc, const char *argv[])
{
char ch;
FILE *fp = NULL;
fp = fopen("test.txt","a+");
if(NULL == fp)
{
perror("fopen");
return -1;
}
scanf("%c",&ch);
fprintf(fp,"hello world");
printf("file_buf:%luKb\n",\
((fp->_IO_buf_end)-(fp->_IO_buf_base))/1024);
printf("file_buf:%luKb\n",\
((stdin->_IO_buf_end)-(stdin->_IO_buf_base))/1024);
printf("file_buf:%luKb\n",\
((stdout->_IO_buf_end)-(stdout->_IO_buf_base))/1024);
fclose(fp);
return 0;
}
测试结果