C语言对文件操作的支持(C++可用)
2018-01-24 18:03
204 查看
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标志,写入完成后再恢复。若文件不存在则先创建。 |
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)
s 4000 ize:以字节为单位的项的大小,如每个
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 | 从文件的开头处开始 |
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{//}
九、二进制文件和文本文件区别与联系(另文写)
相关文章推荐