1. 程式人生 > >【C++】C++讀取特定路徑下所有檔案//*(資料夾下的所有圖片、文件等)

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