C语言对文件操作的支持(C++可用)
相关函数头文件:#include<stdio.h>
一、文件的打开
1、函数声明:FILE *fopen(const char *filename,const char *mode);
2、返回值: FILE
结构体指针,打开失败返回NULL
struct _iobuf {
char *_ptr;
int _cnt;
char *_base;
int _flag;
int _file;
int _charbuf;
int _bufsiz;
char *_tmpfname;
};
typedef struct _iobuf FILE;
3、参数解析:
(1)filename:
文件名
(2)mode:
打开模式,如下表所示
打开模式 | 意义 |
---|---|
r | 只读模式。若文件不存在或不能找到,调用失败,返回NULL 。 |
w | 只写模式。打开一个空文件,若文件已存在,其内容将被清空。 |
a | 只写(追加)模式。若文件已存在,在其尾部添加数据;在写入新数据前,不会移除文件已有的EOF 标志;若文件不存在,则先创建文件。 |
r+ | 读写模式。文件必须存在,若文件已有内容,则会被写入的新数据覆盖。 |
w+ | 读写(清空)模式。打开一个空文件,若文件已存在,其内容会被清空。 |
a+ | 读写(追加)模式。用于读取或追加数据。追加操作新数据之前会移除该文件已有的EOF标志,写入完成后再恢复。若文件不存在则先创建。 |
4、用法:
const char* fileName = "C:/Users/Administrator/Desktop/1.txt";
FILE *pFile=fopen(fileName,"r+"); //返回一个指向FILE结构体的指针
if (pFile){//} //打开了文件,可以进行读写 //if(pFile)=if(pFile!=NULL)
else{//}
二、文件的写入
1、函数声明:size_t fwrite(const void *buffer,size_t size,size_t count,FILE *stream);
2、返回值: size_t
(以字节为单位的项的大小),实际上就是unsigned int
类型,一般等于count
的值,发生错误返回0
3、参数解析:
(1)buffer
:要写入文件的内容
(2)size
:以字节为单位的项的大小,如每个char
的size
=1,每个int
的size
=4
(3)count
:将要被写入的项的最大数目,如果有N个char
,则size
=1,count
=N;如果是N个整型项,若size
=1,则count
=N*4,若size
=4,则count
=N
(4)stream
:文件指针,从fopen
那里获取
4、用法
const char* fileName = "C:/Users/Administrator/Desktop/1.txt";
FILE *pFile=fopen(fileName,"r+"); //返回一个指向FILE结构体的指针
if (pFile) //打开了文件,可以进行读写 //if(pFile)=if(pFile!=NULL)
{
char mybuffer[3] = {48,65,97}; //char(48)=0;char(65)=A;char(97)=a
size_t size=fwrite(&mybuffer,1,3, pFile); //返回值3,文件写入0Aa三个字节
fclose(pFile);
}
else{//}
三、单个文件流的关闭
1、函数声明:int fclose(FILE *stream);
2、返回值: 成功返回0
,失败返回-1(#define EOF=-1)
3、参数解析: stream
:文件指针,从fopen
那里获取
4、用法:
const char* fileName = "C:/Users/Administrator/Desktop/1.txt";
FILE *pFile = fopen(fileName, "r+"); //返回一个指向FILE结构体的指针
if (pFile) //if(pFile)=if(pFile!=NULL)
int a=fclose(pFile); //a=0
int b=fclose(pFile); //b=-1 如果fopen读取文件失败的话,此时pFile=NULL,直接调用fclose会产生错误
//不能使用delete释放
//成功使用fclose关闭文件后,其指针地址未变,但已释放系统分配的缓冲区
四:多个文件流的关闭
1、函数声明:int _fcloseall( void );
2、返回值: 成功返回关闭的文件流的总数,失败则返回-1(#define EOF=-1)
3、解析: _fcloseall
关闭除了stdin, stdout, stderr
的流,并关闭删除所有临时文件,释放系统分配的缓冲区
4、用法: int num_fcloseall= _fcloseall()
五、文件缓存区刷新
1、函数声明:int fflush(FILE *stream );
2、返回值: 当刷新成功时、指定的流没有缓冲区时或流为只读状态返回0
;失败返回返回-1(#define EOF=-1)
3、参数解析: stream
:文件指针,从fopen
那里获取;若参数设置为NULL
,则刷新所有允许输出的流
4、用法:
const char* fileName = "C:/Users/Administrator/Desktop/1.txt";
FILE *pFile=fopen(fileName,"r+"); //返回一个指向FILE结构体的指针
if (pFile) //if(pFile)=if(pFile!=NULL)
{
char mybuffer[3] = {48,65,97}; //char(48)=0;char(65)=A;char(97)=a
size_t size=fwrite(&mybuffer,1,3, pFile); //返回值3,文件写入0Aa三个字节
fflush(pFile);
//fflush(NULL); //刷新所有允许输出的流
fclose(pFile);
}
else{//}
六、文件指针移动
1、函数声明:int fseek(FILE *stream,long offset,int origin );
2、返回值: 定位成功则返回0
,否则返回非0
值
3、参数解析: 文件操作时,文件指针始终指向文件下一个将要写入的位置
(1)stream
:文件指针,从fopen
那里获取
(2)offset
:偏移量
(3)origin
:指定文件指针的起始位置,取值如下表所示:
取值 | 说明 |
---|---|
SEEK_CUR | 从文件指针当前位置处开始 |
SEEK_END | 从文件的结尾处开始 |
SEEK_SET | 从文件的开头处开始 |
4、用法: int pos_fpointer=fseek(pFile,0,SEEK_END);
七:文件指针定位
1、函数声明:long ftell( FILE *stream );
2、返回值: 返回当前文件指针的位置
3、参数解析: stream
:文件指针,从fopen
那里获取
4、用法: 见下文。
八、文件的读取
1、函数声明:size_t fread( void *buffer,size_t size,size_t count,FILE *stream );
2、返回值: 返回值与参数同fwrite
3、用法: ex:读取文件中所有字节
const char* fileName = "C:/Users/Administrator/Desktop/1.txt";
FILE *pFile=fopen(fileName,"r+"); //返回一个指向FILE结构体的指针
if (pFile) //if(pFile)=if(pFile!=NULL)
{
char *pBuf;
fseek(pFile, 0, SEEK_END); //将文件指针移动到文件的结尾处
int len = ftell(pFile); //获取当前文件指针的位置,此时文件指针位于文件结尾处,即可获得文件长度
pBuf = new char[len + 1];
fseek(pFile, 0, SEEK_SET); //由于之前把文件指针移动到文件的结尾处,
//文件读取时若要从文件开头开始,则需把文件指针重新移动回文件开头
//rewind(pFile); //void rewind( FILE *stream); //作用等同于上一行代码
size_t read_size=fread(pBuf, 1, len, pFile);
pBuf[len] = 0; //存放表示字符串结尾的字符:“\0”
fclose(pFile);
}
else{//}