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
- #include <fstream>
- ofstream //文件写操作 内存写入存储设备
- ifstream //文件读操作,存储设备读区到内存中
- 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;
}