【C++】C++读取特定路径下所有文件//*(文件夹下的所有图片、文档等)

内容:主要有两种,一是借助相关结构体,二是针对文件名排练有序。

一、借助结构体

1.引用头文件

#include <io.h>
#include < fstream>
#include < string>

2.适用范围

没有限制。

3.参考程序

void getFiles(string path, vector<string>& files)
{
	intptr_t   hFile = 0;//intptr_t和uintptr_t是什么类型:typedef long int/ typedef unsigned long int
	struct _finddata_t fileinfo;
	string p;
	if ((hFile = _findfirst(p.assign(path).append("\\*").c_str(), &fileinfo)) != -1)//assign方法可以理解为先将原字符串清空,然后赋予新的值作替换。
	{
		do
		{
			if ((fileinfo.attrib &  _A_SUBDIR))//是否为文件夹
			{
				if (strcmp(fileinfo.name, ".") != 0 && strcmp(fileinfo.name, "..") != 0)
					getFiles(p.assign(path).append("\\").append(fileinfo.name), files);//子文件夹下递归访问
			}
			else//非文件夹
			{
				files.push_back(p.assign(path).append("\\").append(fileinfo.name));
			}
		} while (_findnext(hFile, &fileinfo) == 0);
		_findclose(hFile);
	}
}

4.解读程序

4.1 struct _finddata_t:

struct _finddata_t
        {
             unsigned attrib;//文件属性的存储位置。例如_A_ARCH(存档)、 _A_HIDDEN(隐藏)、_A_NORMAL(正常)、_A_RDONLY(只读)、_A_SUBDIR(文件夹)、_A_SYSTEM(系统)。
             time_t time_create;//这里的time_t是长整形变量 long int,用来保存从1970年1月1日0时0分0秒到现在时刻的秒数
             time_t time_access;//文件最后一次被访问的时间。
             time_t time_write;//文件最后一次被修改的时间。
             _fsize_t size;//文件的大小(字节数表示)
             char name[_MAX_FNAME];//文件的文件名。文件的文件名。这里的_MAX_FNAME是一个常量宏,它在头文件中被定义,表示的是文件名的最大长度。
        };

4.2 相应函数说明
该结构体和搭配的函数使用的逻辑就是先用_findfirst查找第一个文件,若成功则用返回的句柄,调用_findnext函数查找其他的文件,当查找完毕后用,用_findclose函数结束查找。
4.2.1 long _findfirst( char *filespec, struct _finddata_t fileinfo );
返回值:如果查找成功的话,将返回一个long型的唯一的查找用的句柄。这个句柄将会在_findnext函数中被使用。失败返回-1.
参数: filespec:标明文件的字符串,可支持通配符。比如:
.c,则表示当前文件夹下的所有后缀为C的文件。
fileinfo :这里就是用来存放文件信息的结构体的指针。这个结构体必须在调用此函数前声明,不过不用初始化,只要分配了内存空间就可以了。函数成功后,函数会把找到的文件的信息放入这个结构体所分配的内存空间中。
4.2.2 int _findnext( long handle, struct _finddata_t *fileinfo );
返回值:若成功返回0,否则返回-1。
参数:handle:即由_findfirst函数返回回来的句柄。
fileinfo:文件信息结构体的指针。找到文件后,函数将该文件信息放入此结构体中。
4.2.3 int _findclose( long handle );
返回值:成功返回0,失败返回-1。
参数:handle :_findfirst函数返回回来的句柄。

4 补充说明

读取个文件夹下面的200张1~200有序的图片,但是他并非从1 ~200的下标读取,自行看下面有意思的读取顺序。
在这里插入图片描述

二、借助stringstream

1.引用头文件

#include
#include

2.适用背景

一般是文件夹内部的文件命名具有规律性。比如下标为1.bmp 2.bmp 3.bmp……

3.参考程序

	std::stringstream StrStm;
	string tem;
	string filePath = "faces\\train200\\"; //正样本路径
	for (int i = 0; i < 200; i++)
	{
		StrStm.clear();
		tem.clear();
		StrStm << (i + 1);//输入int型
		StrStm >> tem;//输出string型
		string picpath = filePath + tem + ".BMP";
		vector<Mat> SrcImage;
		SrcImage.push_back(cv::imread(picpath, IMREAD_GRAYSCALE));
	}

4.程序解析

4.1 stringstream简化类型转换
stringstream是 C++ 提供的另一个字串型的串流(stream)物件,和之前学过的iostream、fstream有类似的操作方式。
4.1.1 string到int

string result = “50";  
int n = 0;  
stream << result;  
stream >> n;  //n等于50

4.1.2 int /double/float转string

string result ;  
int n = 50;  
stream << n;  
stream >> result;  //result ="50"

三、c读取文件夹

文本文件或二进制文件
#include <stdlib.h>

 FILE * fp;
fp = fopen("lizi.txt","r|w");

推荐微信公众号:C/C++的编程教室

猜你喜欢

转载自blog.csdn.net/qq_35705332/article/details/84945315