C++读写文件

1、C++基础:数据流、缓冲区、文件类型

●数据流stream:程序与数据间的交互是以流的形式进行的,文件存取时都会先进行 “打开文件” 的操作,目的是打开数据流,而“关闭文件”操作就是关闭数据流。

●缓冲区Buffer:程序执行时提供额外的内存以暂时存放数据。缓冲区的作用是提高存取效率,因为内存的存取速率比磁盘快。

●文件类型:分为文本文件和二进制文件。

  文本文件:字符编码的形式进行保存。

  二进制文件:内存中的数据原封不动至文件中,适用于非字符为主的数据。优点:存取速度快,占用空间小。

2、文件读写流程

  文件数据读取时,先打开数据流,将磁盘上的文件信息拷贝到缓冲区内,然后再从缓冲区中读取所需数据;

  当数据写入文件时,先将数据写入缓冲区,只有在缓冲区已满或“关闭文件”后,才会将数据写入磁盘;

  2.1 、常用函数

  打开文件:errno_t fopen_s( FILE** pFile, const char *filename, const char *mode );//打开文件,如果成功返回0

  参数说明: pFile:文件指针

        filename:文件名  

        mode:允许访问的类型

  读取文件:size_t fread ( void *buffer, size_t size, size_t count, FILE *stream) ;//它从文件流中读数据,最多读取count个项,每个项size个字节,如果调用成功返回实际读取到的项个数(小于或等于count)

  参数说明:buffer :用于接收数据的内存地址

       size : 要读取的每个数据项的字节数

       count : 要读取count个数据,每个数据size个字节

       stream : 要读取的文件指针

  写文件:size_t fwrite(const void* buffer, size_t size, size_t count, FILE* stream);//返回实际写入的数据项的个数

  参数说明:buffer : 是一个指针,要获取的数据的地址

           size : 要写入内容的单字节数

        count : 要进行写入size字节的数据项的个数

       stream : 目标文件指针

int main()
{
    FILE *file = nullptr;
    std::shared_ptr<short> spVolCTValue(new short [20447232],[](short *p){delete []p;});
    if (fopen_s(&file, "E://Colon.raw", "rb") == 0)
    {
        size_t nCount = fread(spVolCTValue.get(), sizeof(short),20447232, file);
        nCount;
        fclose(file);
    }
    std::shared_ptr<McsfAlgoVirtualColonoscopy> spAlgoVirtualColonoscopy;
    int iDim[3]={512,512,78};
    float fSpacing[3] = {0.58593750,0.58593750,3.0};
    bool bStool = false;
    spAlgoVirtualColonoscopy.reset(new McsfAlgoVirtualColonoscopy(spVolCTValue.get()/*pData*/, iDim, fSpacing));
    spAlgoVirtualColonoscopy->ColonSegmentation(true, bStool);
    return 0;
}
bool StaObjectColonVolumeData::CreatAlgoVirtualColonoscopy( )
{
    auto spImageData  =  getImgData();
    std::shared_ptr<short> spVolCTValue;
    int iDim[3];
    spImageData->GetDimension(iDim);
    double dSpacing[3];
    spImageData->GetSpacing(dSpacing);
    float fSpacing[3] = {static_cast<float>(dSpacing[0]), static_cast<float>(dSpacing[1]), static_cast<float>(dSpacing[2])};
    std::array<size_t,3> arrDim = spImageData->GetDimension();
    m_spVolCTValue = ModalityUtility::TransformToCTValue(spImageData, arrDim, m_bIsReverse);

    FILE* file = nullptr;
    fopen_s(&file, "E://Colon.raw","wb");
    size_t count = fwrite(spVolCTValue.get(),sizeof(short),iDim[0]*iDim[1]*iDim[2],file);
    fclose(file);
    m_spAlgoVirtualColonoscopy.reset(new McsfAlgoVirtualColonoscopy(m_spVolCTValue.get(), iDim, fSpacing));
    return true;
}

  

第二种读取文件的方式:ofstream,ifstream, fstream
  1. #include <fstream>  
  2. ofstream         //文件写操作 内存写入存储设备   
  3. ifstream         //文件读操作,存储设备读区到内存中  
  4. fstream          //读写操作,对打开的文件可进行读写操作   

打开文件:

  在fstream中,成员函数open()实现打开文件的操作,从而将数据流和文件进行关联。

    open(const char *_Filename, std::ios_base::openmode);

参数说明:_Filename :要打开的文件名

      openmode : 打开方式(下面的方式是能够进行组合使用的,以“或”运算(“|”)的方式)

      

  读写文件:write ( char * buffer, streamsize size );
       read ( char * buffer, streamsize size );

      参数说明:buffer : 是一块内存,用来存取或读出数据

           size  :一个整数值,表示要从缓存(buffer)中读出或写入的字符数

 

 写文件举例:

bool StaObjectColonVolumeData::CreatAlgoVirtualColonoscopy( )
{
    auto spImageData  =  getImgData();
    int iDim[3];
    spImageData->GetDimension(iDim);
    double dSpacing[3];
    spImageData->GetSpacing(dSpacing);
    float fSpacing[3] = {static_cast<float>(dSpacing[0]), static_cast<float>(dSpacing[1]), static_cast<float>(dSpacing[2])};
    std::array<size_t,3> arrDim = spImageData->GetDimension();
    m_spVolCTValue = ModalityUtility::TransformToCTValue(spImageData, arrDim, m_bIsReverse);

    fstream fileout;
    fileout.open("E://Colon.raw", std::ios::binary|std::ios::out);
    //上两句可以合并成:fstream fileout( "E://Colon.raw", std::ios::binary|std::ios::out);
   //或者 ofstream fileout("E://Colon1.raw", std::ios::binary|std::ios::out); fileout.write((char*)(m_spVolCTValue.get()), iDim[0]*iDim[1]*iDim[2]*sizeof(short) ); fileout.close(); m_spAlgoVirtualColonoscopy.reset(new McsfAlgoVirtualColonoscopy(m_spVolCTValue.get(), iDim, fSpacing)); return true; }

  

 读文件举例:

int main()
{
    std::shared_ptr<short> spVolCTValue(new short [20447232],[](short *p){delete []p;});
   
    ifstream in("E://Colon.raw", std::ios::binary|std::ios::in);
    in.read((char *)spVolCTValue.get(),20447232*sizeof(short));
    std::shared_ptr<McsfAlgoVirtualColonoscopy> spAlgoVirtualColonoscopy;
    int iDim[3]={512,512,78};
    float fSpacing[3] = {0.58593750,0.58593750,3.0};
    bool bStool = false;
    spAlgoVirtualColonoscopy.reset(new McsfAlgoVirtualColonoscopy(spVolCTValue.get()/*pData*/, iDim, fSpacing));
    spAlgoVirtualColonoscopy->ColonSegmentation(true, bStool);
    return 0;
}

  

  

 

转载于:https://www.cnblogs.com/leitongwangtingting/p/10784966.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值