从文件夹中读取子文件夹内带有指定后缀如.bmp文件的C++实现,并读取子文件夹后缀数字

void face::read_img_yalefacesA() {
	GetFileList( img_folder,"AllDir",".bmp","outyalefacesA.txt",img_name,img_lable);
}


/**===============从一个文件夹(的子文件夹*9----否则类别标签无效)中读取所有满足后缀为PostfixType的文件名=========
 * FileDir代表文件夹路径名
 * PostfixType代表目标文件后缀,例如bmp,如果为NO,则代表不检查后缀
 * FileListType代表是否读取子文件夹。0,代表不读取子文件夹;1,代表读取子文件夹
 * FileNum代表目标文件数目
 * img_name 保存路径名
 * img_lable 保存文件的父文件夹尾数数字(设定最多最后2位是要获得的数字,利用yale09\08.bmp,获得数字9)
 */
void face::GetFileListInOneDir( string FileDir, string PostfixType,
		const int &FileListType, int &FileNum, ofstream &fop,
		string houzhui,string subhouzhui,
		vector<string>& img_name,vector<int>& img_lable)
//===========If FileListType = 0; just get current file list in current dir, not consider subdir;
//===========if FileListType != 1, Get All FileList in this dir, including subdir;
{

	struct _finddata_t fileinfo;
	int hFile = 0;

	string FileDirTemp = FileDir;
	cout<<"FileDirTemp"<<FileDirTemp<<endl;
	FileDirTemp +="\\";
	FileDirTemp += houzhui;
	cout<<"FileDirTemp += houzhui"<<FileDirTemp<<endl;
	if( (hFile = _findfirst( FileDirTemp.c_str(), &fileinfo) ) == -1L ){
		printf("没有找到匹配的项目\n");
		cout<<FileDirTemp<<endl;
		cout<<"fileinfo "<<fileinfo.name<<endl;
		return;
	}else{
		/*printf("找到匹配的项目\n");*/
		//如果遍历到的是一个子文件夹
		if( fileinfo.attrib &_A_SUBDIR )
		{
			if(FileListType != 0 && strcmp( fileinfo.name, "." )!= 0 && strcmp( fileinfo.name, "..") != 0 )
			{
				string SubFileDir = FileDir;
				SubFileDir += "\\";
				SubFileDir += fileinfo.name;
				GetFileListInOneDir( SubFileDir, PostfixType, FileListType, FileNum, fop, houzhui, subhouzhui,img_name,img_lable ); //递归for所有的subdir;

			}
			if(FileListType == 0 && strcmp( fileinfo.name, "." )!= 0 && strcmp( fileinfo.name, "..") != 0 )
			{

				string SubFileDir = FileDir;
				SubFileDir += "\\";
				string FileName = fileinfo.name;
				SubFileDir += FileName;

				if(PostfixType == "NO"){
					fop<<SubFileDir<<endl;
					FileNum++;
				}else{
					int Pos = FileName.find(PostfixType.c_str());
					if( Pos != (int)string::npos )
					{
						fop<<SubFileDir<<endl;
						FileNum++;
					}
					//若没找到,则不做处理,继续外循环
				}
			}
		}//end if a subdir;
		else
		{//如果遍历到的是文件,而不是文件夹----比较后缀
			string FileName = fileinfo.name;
			if(PostfixType == "NO"){
				fop<<FileDir + "\\"+ FileName<<endl;
				FileNum++;
			}else{
				int Pos = FileName.find(PostfixType.c_str());
				if( Pos != (int)string::npos )
				{

					string FileDirc = FileDir;
					string temp;
					int numlabel = -1;
					if(FileDirc.length()>=2){
						//E:\face_recognizer\face_sample\CroppedYaleB\yaleB02
						//上层的2位
						if((FileDirc.at(FileDirc.length()-2)>'0') && (FileDirc.at(FileDirc.length()-2)<='9')){
							temp = FileDirc.substr(FileDirc.length()-2,2);
							numlabel = atoi(temp.c_str());
						}else if((FileDirc.at(FileDirc.length()-1)>'0') && (FileDirc.at(FileDirc.length()-1)<='9')){
							temp = FileDirc.substr(FileDirc.length()-1,1);
							numlabel = atoi(temp.c_str());
						}else{
							cout<<"文件*"<<PostfixType<<"的父文件夹尾数不含数字,不能作为类别标签读入!请重新命名或归类"<<endl;
							exit(-1);
						}
					}else{
						//FileDirc.length()==1
						if((FileDirc.at(0)>'0') && (FileDirc.at(0)<='9')){
							temp = FileDirc.substr(FileDirc.length()-1,1);
							numlabel = atoi(temp.c_str());
						}else{
							cout<<"文件*"<<PostfixType<<"的父文件夹尾数不含数字,不能作为类别标签读入!请重新命名或归类"<<endl;
							exit(-1);
						}
					}

					fop<<"temp.c_str() = "<<temp.c_str()<<endl;
					fop<<"numlabel = "<<numlabel<<endl;
					img_lable.push_back(numlabel);
					fop<<FileDir + "\\"+ FileName<<endl;
					img_name.push_back(FileDir + "\\"+ FileName);
					FileNum++;
				}
			}
		}
	}

	while( _findnext( hFile, &fileinfo ) == 0 )
	{
		/*printf("找到匹配的项目\n");
		cout<<"fileinfo "<<fileinfo.name<<endl;*/
		//========判断是否是一个subdir==========//
		//如果遍历到的是一个子文件夹
		//如果遍历到的是一个子文件夹
		if( fileinfo.attrib &_A_SUBDIR )
		{
			if(FileListType != 0 && strcmp( fileinfo.name, "." )!= 0 && strcmp( fileinfo.name, "..") != 0 )
			{
				string SubFileDir = FileDir;
				SubFileDir += "\\";
				SubFileDir += fileinfo.name;
				cout<<"fileinfo"<<fileinfo.name<<endl;

				GetFileListInOneDir( SubFileDir, PostfixType, FileListType, FileNum, fop, houzhui, subhouzhui,img_name,img_lable); //递归for所有的subdir;---------不能*.*

			}if(FileListType == 0 && strcmp( fileinfo.name, "." )!= 0 && strcmp( fileinfo.name, "..") != 0 )
			{

				string SubFileDir = FileDir;
				SubFileDir += "\\";
				string FileName = fileinfo.name;
				SubFileDir += FileName;
				cout<<"fileinfo"<<fileinfo.name<<endl;
				if(PostfixType == "NO"){
					fop<<SubFileDir<<endl;
					FileNum++;
				}else{
					int Pos = FileName.find(PostfixType.c_str());
					if( Pos != (int)string::npos )
					{
						fop<<SubFileDir<<endl;
						FileNum++;
					}
					//若没找到,则不做处理,继续外循环
				}
			}
		}//end if a subdir;
		else
		{//如果遍历到的是文件,而不是文件夹----比较后缀
			string FileName = fileinfo.name;
			cout<<"fileinfo "<<fileinfo.name<<endl;
			if(PostfixType == "NO"){
				fop<<FileDir + "\\"+ FileName<<endl;
				FileNum++;
			}else{
				int Pos = FileName.find(PostfixType.c_str());
				if( Pos != (int)string::npos )
				{

					string FileDirc = FileDir;
					string temp;
					int numlabel = -1;
					if(FileDirc.length()>=2){
						//E:\face_recognizer\face_sample\CroppedYaleB\yaleB02
						//上层的2位
						if((FileDirc.at(FileDirc.length()-2)>'0') && (FileDirc.at(FileDirc.length()-2)<='9')){
							temp = FileDirc.substr(FileDirc.length()-2,2);
							numlabel = atoi(temp.c_str());
						}else if((FileDirc.at(FileDirc.length()-1)>'0') && (FileDirc.at(FileDirc.length()-1)<='9')){
							temp = FileDirc.substr(FileDirc.length()-1,1);
							numlabel = atoi(temp.c_str());
						}else{
							cout<<"文件*"<<PostfixType<<"的父文件夹尾数不含数字,不能作为类别标签读入!请重新命名或归类"<<endl;
							exit(-1);
						}
					}else{
						//FileDirc.length()==1
						if((FileDirc.at(0)>'0') && (FileDirc.at(0)<='9')){
							temp = FileDirc.substr(FileDirc.length()-1,1);
							numlabel = atoi(temp.c_str());
						}else{
							cout<<"文件*"<<PostfixType<<"的父文件夹尾数不含数字,不能作为类别标签读入!请重新命名或归类"<<endl;
							exit(-1);
						}
					}
					fop<<"temp.c_str() = "<<temp.c_str()<<endl;
					fop<<"numlabel = "<<numlabel<<endl;
					img_lable.push_back(numlabel);
					fop<<FileDir + "\\"+ FileName<<endl;
					img_name.push_back(FileDir + "\\"+ FileName);
					FileNum++;

				}
			}
		}//end while;
	}
	_findclose( hFile );

}//end WF;

/**
 * FileDir代表文件夹路径名
 * PostfixType代表目标文件后缀,例如bmp,如果为NO,则代表不检查后缀
 * CurrentDirOrAllDir代表是否读取子文件夹。"CurrentDir",代表不读取子文件夹;"CurrentDir",代表读取子文件夹
 * FileNum代表目标文件数目
 */
void face::GetFileList( string FileDir, string CurrentDirOrAllDir,
		string Postfix, string OutputFileList,
		vector<string>& img_name,vector<int>& img_lable)
{

	ofstream output( OutputFileList.c_str(), ios::out | ios::in | ios::app);
	int FileListType = 0;
	if( CurrentDirOrAllDir == "CurrentDir" ) FileListType = 0;  //just get current filedir file list;
	else if( CurrentDirOrAllDir == "AllDir" ) FileListType = 1; // get all file list, including in subdir;
	else return;

	cerr<<"FileCount..."<<endl;

	int FileNum = 0;
	GetFileListInOneDir( FileDir, Postfix, FileListType,
			FileNum, output, "*.*" ,"*.*",
			img_name,img_lable);
	output.close();

	cerr<<"<"<<FileNum<<"> Files In FileDir:===="<<FileDir<<"===="<<endl;

}//end WF;



命令行输入:E:\face_recognizer\face_sample\yalefacesA

文件夹结构:



结果:




方法二(懒汉式,确定见其中"以yaleB为例!"):

void face::read(){

	cout<<"输入train样本库路径(**\\**\\):"<<endl;  // 不要双斜线输入
	cin>>train_folder;
	cout<<train_folder<<endl;

	ofstream output( "read.txt", ios::out | ios::in | ios::app);
	if(train_folder == "E:\\face_recognizer\\face_sample\\CroppedYaleB"){
		output<<"以yaleB为例!"<<endl;
		cout<<"CroppedYaleB\yaleB14中没有.bmp文件,且,各个yaleB*中.bmp不等,不能以此读取。"<<endl;
		exit(-1);
	}
	if(train_folder == "E:\\face_recognizer\\face_sample\\yalefacesA"){
		output<<"以yaleA为例!"<<endl;
		train_folder.append("\\");
		char cnum[5];
		char cnumsub[5];
		for(int r=1; r<=15; r++){
			string temp = train_folder;//copy
			itoa(r,cnum,10);
			if(r<10){
				temp.append("0");
			}
			temp.append(cnum);
			temp.append("\\");
			for(int c=1; c<=11; c++){
				string tempsub = temp;//copy
				tempsub.append("s");
				itoa(c,cnumsub,10);
				tempsub.append(cnumsub);
				output<<tempsub<<endl;
				output<<r<<endl;
				this->imgtrain_name.push_back(tempsub);
				this->labletrain.push_back(r);
			}
		}
	}
	output.close();
}



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值