C语言对文件操作的支持(C++可用)

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:以字节为单位的项的大小,如每个charsize=1,每个intsize=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{//}

九、二进制文件和文本文件区别与联系(另文写)


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值