Clibrary | 【02】文件访问fclose、fflush、fopen、freopen、setbuf、setvbuf

前言

以下是<cstdio>对文件访问的函数。

1、fclose

int fclose ( FILE * stream );

/*
* @func:关闭文件;
* 		- 与流关联的所有内部缓冲区都被解除关联并刷新:写入任何未写入输出缓冲区的内容,丢弃任何未读输入缓冲区的内容
* @param stream:指向指定要关闭的流的FILE对象的指针;
* @return:成功返回0, 失败返回EOF;
*/

案例

/*----------------------------------------------------------------------
	> File Name: stdioDemo.cpp
	> Author: Jxiepc
	> Mail: Jxiepc
	> Created Time: Mon 20 Sep 2021 04:20:08 PM CST
----------------------------------------------------------------------*/

#include<iostream>
#include<unistd.h>
#include<cstring>
#include<cstdio>

void myFclose(){
	FILE * f = fopen("file.txt", "wt");
    fprintf(f, "test file");
    fclose(f);                                                                                                         
}

2、fflush

int fflush ( FILE * stream );

/*
* @func:刷新流;
* 	 - 若给定的流打开了写入或更新,且最后的i/o操作是一个输出操作),则会将输出缓冲区的内容都写入文件;
* 	 - 如果stream为NULL,则所有这样的流都将被刷新;
* 	 - 在某些实现中,为读取而刷新打开的流会导致清除其输入缓冲区;
* 	 - 当一个文件被关闭时(调用fclose还或程序终止),与它相关的所有缓冲区都会被自动刷新。  
* @param stream:指向指定缓冲流的FILE对象的指针;
* @return:成功返回0;错误返回EOF;
*/

案例

/*----------------------------------------------------------------------
	> File Name: stdioDemo.cpp
	> Author: Jxiepc
	> Mail: Jxiepc
	> Created Time: Mon 20 Sep 2021 04:20:08 PM CST
----------------------------------------------------------------------*/

#include<iostream>
#include<unistd.h>
#include<cstring>
#include<cstdio>

void myFflush(){
	char buf[1024];
	FILE *f = fopen("file.txt", "r+");
	if(f != NULL){
		fputs("test fflush stream", f);
		fflush(f);
		fgets(buf, 1024, f);
		fclose(f);
	}else{
		perror("error open");	
		exit(-1);
	}
}

3、fopen

FILE * fopen ( const char * filename, const char * mode );

/*
* @func:打开的文件  ; 
* @param filename:打开的文件名;
* @param mode :打开文件的模式;
* 		r - 读取:打开文件进行输入操作。该文件必须存在;
* 		w - 写入:创建空文件。若存在同名文件,则视为新的空文件;
* 		a - 追加:追加文件末尾,如果文件不存在,则创建该文件;
* 		r+ - 读取/更新:打开一个文件进行更新(用于输入和输出)。该文件必须存在;
* 		w+ - 写入/更新:创建空文件并打开它以进行更新(用于输入和输出)。若存在同名文件,则视为新的空文件;
* 		a+ - 追加/更新:打开一个文件进行更新(用于输入和输出),追加文件末尾。如果文件不存在,则创建该文件。、
* 		b - 若打开二进制文件,则在前面的模式加上`b`;
* @return:成功返回指向FILE对象的指针;错误返回NULL;
* 
*/

案例

/*----------------------------------------------------------------------
	> File Name: stdioDemo.cpp
	> Author: Jxiepc
	> Mail: Jxiepc
	> Created Time: Mon 20 Sep 2021 04:20:08 PM CST
----------------------------------------------------------------------*/

#include<iostream>
#include<unistd.h>
#include<cstring>
#include<cstdio>

void myFopen(){
	FILE *f = fopen("file.txt", "r+");
	if(f != NULL){
		std::cout << "文件打开成功..." << std::endl;
	}else{
		perror("error open");	
		exit(-1);
	}
}

4、freopen

FILE * freopen ( const char * filename, const char * mode, FILE * stream );

/*
* @func:以不同的文件或模式重新打开流 ; 
* @param filename:打开的文件名;
* 		- 如果filename是空指针,函数将尝试更改流的模式。 尽管特定的库实现可以限制允许的更改,以及在什么情况下允许;
* @param mode :打开文件的模式;
* 		r - 读取:打开文件进行输入操作。该文件必须存在;
* 		w - 写入:创建空文件。若存在同名文件,则视为新的空文件;
* 		a - 追加:追加文件末尾,如果文件不存在,则创建该文件;
* 		r+ - 读取/更新:打开一个文件进行更新(用于输入和输出)。该文件必须存在;
* 		w+ - 写入/更新:创建空文件并打开它以进行更新(用于输入和输出)。若存在同名文件,则视为新的空文件;
* 		a+ - 追加/更新:打开一个文件进行更新(用于输入和输出),追加文件末尾。如果文件不存在,则创建该文件。、
* 		b - 若打开二进制文件,则在前面的模式加上`b`;
* @param stream:指向FILE对象的指针,该对象标识要重新打开的流;
* @return:成功返回stream传递的指针;错误返回NULL;
*/

案例

/*----------------------------------------------------------------------
	> File Name: stdioDemo.cpp
	> Author: Jxiepc
	> Mail: Jxiepc
	> Created Time: Mon 20 Sep 2021 04:20:08 PM CST
----------------------------------------------------------------------*/

#include<iostream>
#include<unistd.h>
#include<cstring>
#include<cstdio>

void myFopen(){
	 freopen ("myfile.txt","w",stdout);
  	 printf ("This sentence is redirected to a file.");
 	 fclose (stdout);
}

5、setbuf

void setbuf ( FILE * stream, char * buffer );

/*
* @func:设置流缓冲区; 
* 	 	- 指定流用于I/O操作的缓冲区是完全缓冲的流;
* 		- 若buffer是NULL,则对流禁用缓冲,这将成为一个未缓冲的流;
* 		- 一旦流与打开的文件相关联,但在对该文件执行任何输入或输出操作之前,应该调用此函数;
* 		- 用于设置特定的内存块作为缓冲区或禁用流的缓冲
* 		
* @param stream:指向标识打开流的FILE对象的指针;
* @param buffer :用户分配的缓冲区,长度至少为BUFSIZ字节。或可以指定一个空指针来禁用缓存。
* @return:无;
*/

案例

/*----------------------------------------------------------------------
	> File Name: stdioDemo.cpp
	> Author: Jxiepc
	> Mail: Jxiepc
	> Created Time: Mon 20 Sep 2021 04:20:08 PM CST
----------------------------------------------------------------------*/

#include<iostream>
#include<unistd.h>
#include<cstring>
#include<cstdio>

void mySetbuf(){

	char buf[1024];

	FILE *p1 = fopen("file1.txt", "w");
	FILE *p2 = fopen("file2.txt", "a");

	setbuf(p1, buf);
	fputs("test, file1 buf", p1);
	fflush(p1);

	setbuf(p2, NULL);
	fputs("test file2 NULL", p2);
	
	fclose(p1);
	fclose(p2);			
}

6、setvbuf

int setvbuf ( FILE * stream, char * buffer, int mode, size_t size );

/*
* @func:更改流缓冲; 
* 		- 为stream 指定缓冲区。该函数允许指定缓冲区的模式和大小(以字节为单位);
* 		-  如果缓冲区是一个空指针,该函数会自动分配一个缓冲区;
* @param stream:指向标识打开流的FILE对象的指针;
* @param buffer:用户分配的缓冲区,长度至少为size字节。或可以指定一个空指针来禁用缓存。
* @param mode:
* 		_IOFBF - 全缓冲:在输出时,一旦缓冲区已满(或已刷新)就会写入数据。在输入时,当请求输入操作并且缓冲区为空时填充缓冲区;
* 		_IOLBF - 行缓冲:在输出时,当将换行符插入到流中或缓冲区已满(或已刷新)时,都会写入数据。在输入时,当请求输入操作并且缓冲区为空时,缓冲区被填充到下一个换行符;
* 		_IONBF - 无缓冲:不使用缓冲。每个 I/O 操作都会尽快写入。在这种情况下,缓冲区和大小参数将被忽略;
* @param size:缓冲区大小,以字节为单位。若缓冲区参数是空指针,则该值可以确定函数为缓冲区自动分配的大小;
* @return:成功返回0,失败返回非0;
*/

案例

/*----------------------------------------------------------------------
	> File Name: stdioDemo.cpp
	> Author: Jxiepc
	> Mail: Jxiepc
	> Created Time: Mon 20 Sep 2021 04:20:08 PM CST
----------------------------------------------------------------------*/

#include<iostream>
#include<unistd.h>
#include<cstring>
#include<cstdio>

void mySetvbuf(){

  FILE *pFile;
  pFile=fopen ("myfile.txt","w");
  setvbuf ( pFile , NULL , _IOFBF , 1024 );
  fclose (pFile);
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Jxiepc

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值