c++基础(3)——文件读写操作(fopen,fclose,fwrit,ftell,fseek,rewind)

fopen()函数:打开文件

包含头文件:#include<stdio.h>

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

参数
 path:需要打开的文件路径
 mode:文件打开方式

  • r     以只读方式打开文件,该文件必须存在。
  • r+     以可读写方式打开文件,该文件必须存在。
  • rb+     读写打开一个二进制文件,允许读数据。
  • rt+     读写打开一个文本文件,允许读和写。
  • w     打开只写文件,若文件存在则文件长度清为0,即该文件内容会消失。若文件不存在则建立该文件。
  • w+     打开可读写文件,若文件存在则文件长度清为零,即该文件内容会消失。若文件不存在则建立该文件。
  • a     以附加的方式打开只写文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾,即文件原先的内容会被保留。(EOF符保留)
  • a+     以附加方式打开可读写的文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾后,即文件原先的内容会被保留。 (原来的EOF符不保留)
  • wb     只写打开或新建一个二进制文件;只允许写数据。
  • wb+     读写打开或建立一个二进制文件,允许读和写。
  • wt+     读写打开或着建立一个文本文件;允许读写。
  • at+     读写打开一个文本文件,允许读或在文本末追加数据。
  • ab+     读写打开一个二进制文件,允许读或在文件末追加数据。

 返回值
    如果文件顺利打开,返回指向该流的文件指针。如果文件打开失败则返回NULL,并把错误代码存在errno中。
 一般而言,打开文件后会作一些文件读取或写入的动作,若打开文件失败,接下来的读写动作也无法顺利进行,所以一般在fopen()后作错误判断及处理 
    
例子:

#include <stdio.h>
int main(void)
{
    FILE *fp = NULL; /* 需要注意 */
    fp = fopen(“test.txt”, "r");
    if (NULL == fp)
    {
        return -1; /* 要返回错误代码 */
    }
    fclose(fp);
    fp = NULL; /* 需要指向空,否则会指向原打开文件地址 */
    return 0;
}

fclose(): 关闭打开的文件

头文件:#include <stdio.h>

定义函数:int fclose(FILE * stream);

函数说明:fclose()用来关闭先前fopen()打开的文件。此动作会让缓冲区内的数据写入文件中, 并释放系统所提供的文件资源。必要时刷新缓冲区。

对于比较正式的程序,应该检查是否成功关闭文件。如果成功关闭,fclose()函数返回0,否则返回EOF:

if (fclose(fp) != 0)
  printf("Error in closing file %s\n",argv[1]);

 

fread()函数和fwrite()函数:(可以用来实现对数据块的操作)

  fread(buffer,size,count,fp);

  fwrite(buffer,size,count,fp);

参数:

  • buffer:是一个指针,对fread来说,它是读入数据的存放地址。对fwrite来说,是要输出数据的地址。
  • size:要读写的字节数;(一个数据块的字节数)
  • count:要进行读写多少个size字节的数据项;(要读写的数据块块数)
  • fp:文件型指针

例如:
fread(fa,4,5,fp); 其意义是从fp所指的文件中,每次读4个字节(一个实数)送入实数组fa中,连续读5次,即读5个实数到fa中

返回值:

fread返回值为块成功读取块的count数量。
fwrite返回值为块成功写入快的count数量
例子:

#include <stdio.h>  
void main()  
{  
    int num;  
    char name[5];  
    FILE *fp;  
    if ((fp = fopen("t.txt", "w")) == NULL)  
        printf("cannot open file!\n");  
   scanf("%d %s",&num,name);  
   fprintf(fp, "%d %s", num, name);  
   fclose(fp);  
   if ((fp = fopen("tt.txt", "w")) == NULL)  
        printf("cannot open file!\n");  
   fwrite(&num, sizeof(int), 1, fp);  
   fwrite(name, sizeof(char), 5, fp);  
   fclose(fp);   
}  

ftell() 函数:得到流式文件的当前读写位置,其返回值是当前读写位置偏离文件头部的字节数。

long ftell(FILE *fp)

fseek() 函数:把fp的文件读写位置指针移到指定的位置。

int fseek(FILE *fp,long offset,int origin);

origin指的是“起始点”,它有三个常量的值,如下:

起始点对应的数字   代表的文件位置

  • SEEK_SET 0   文件开头
  • SEEK_CUR 1   文件当前位置
  • SEEK_END 2   文件末尾

rewind() 函数:将文件指针重新指向一个流的开头

int rewind(FILE *stream);

例子:一般我们会通过下面的方法来获取文件中字符的个数:

    FILE *fs=fopen("C:\1.txt","r");//创建文件流
    long length=0;//声明文件长度
    fseek(fs,0,SEEK_END);//将文件内部指针放到文件最后面
    length=ftell(fs);//读取文件指针的位置,得到文件字符的个数
    rewind(fs);//将文件指针重置到文件最前面

例子:

string ReadYamlFile(string& filePath)
{
    string strData="";
    const char * p8File = (char*)filePath.c_str();

    FILE *fp;
    fp = fopen(p8File,"r");
    if(fp == NULL)
    {
      cout<<"cannot read file, open error"<<endl;
      return "false";
    }

    fseek(fp,0,SEEK_END);//将文件内部的指针指向文件末尾
    long lsize=ftell(fp);//获取文件长度,(得到文件位置指针当前位置相对于文件首的偏移字节数)
    rewind(fp);//将文件内部的指针重新指向一个流的开头
    //fclose(fp);

    char *pData= new char[lsize+1];
    memset(pData,0,lsize+1);//将内存空间都赋值为‘\0’

    int result=fread(pData,1,lsize,fp);//将pfile中内容读入pread指向内存中
    fclose(fp);
    strData = std::string(pData);

    if(pData)
    {
        delete[] pData;
        pData = NULL;
    }
    return strData;
}

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值