前言
以下是
<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);