内容:主要有两种,一是借助相关结构体,二是针对文件名排练有序。
一、借助结构体
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++的编程教室