fopen函数

/***********************************************
*功能:打开文件,返回FILE*类型的流指针
*参数:
*      @path   要打开的文件(字符串)
*      @mode   打开文件的模式
*返回值:
*          成功:FILE指针
*          失败:NULL,并设置了errno
**********************************************/
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;   /* Start of reserve area. */
char* _IO_buf_end;    /* End of reserve area. */   
...
int _fileno;
}; 

系统在执行程序的时候,会默认打开3个流:

标准输入 ---> stdin
标准输出 ---> stdout
标准错误 ---> stderr

缓存区:

全缓存:对普通文件操作(fopen打开后,返回的流指针FILE *)
        大小为4KB缓存区
        完成缓存区数据刷新条件:
        
1. 缓存区满
2. 强制刷新 --->>> fflush();

/**************************************
 *功能:刷新缓存区
 *参数:
 *      @stream  流指针 
 *返回值:
 *      成功返回 0 
 *      失败返回 EOF
 *************************************/
 int fflush(FILE *stream);
3.文件关闭的时候刷新缓存区

行缓存:对终端进行的操作(标准输入,标准输出)
大小为1KB缓存区

完成缓存区数据刷新条件:
1. 缓存区满
2. 强制刷新 --->>> fflush();
3. 遇到'\n'
4. 程序正常退出的时候return
5. 调用exit退出的时候

无缓存:大小0,标准错误

perror

/******************************************
*功能:根据errno打印出错信息
*参数:
*           @s  提示用的字符串
*返回值:void
****************************************/   

void perror(const char *s);
        

fprintf

/***************************************************
*功能:将格式换内容输出到指定的文件流中
*参数: 
*          @stream 文件流指针
*          @format 格式化输出内容
*          @...    不定参数
**************************************************/    
int fprintf(FILE *stream, const char *format, ...);


sprintf

/**************************************************
*功能:将格式换内容写入str指针指向的空间
*参数: 
*          @str    char *指针
*          @format 格式化输出内容
*          @...    不定参数
*************************************************/     
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;
}


测试结果

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值