【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++的程式設計教室