c++实现递归查找文件

本文介绍了在C++中使用递归查找文件的方法,包括查找所有文件和特定文件的函数实现,并探讨了string和CString之间的转换。同时,文章提到了对十六进制txt文件的理解,讨论了数据在不同格式间的转换,如从byte数组到16进制字符串,以及如何写成txt和dat文件。
摘要由CSDN通过智能技术生成

提示:在view开发中用到递归查找文件的方法


前言

提示:这里可以添加本文要记录的大概内容:

例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。


提示:以下是本篇文章正文内容,下面案例可供参考

一、递归查找文件

头文件

#include <io.h>
#include <fstream>
#include <string>
#include <vector>
#include <iostream>
using namespace std

代码

void getAllFiles(string path, vector<string>& files) {
	//文件句柄
	long long hFile = 0;
	//文件信息
	struct _finddata_t fileinfo;  
	string p;  
	if ((hFile = _findfirst(p.assign(path).append("\\*").c_str(), &fileinfo)) != -1) {
		do {
			if ((fileinfo.attrib & _A_SUBDIR)) {  //比较文件类型是否是文件夹
				if (strcmp(fileinfo.name, ".") != 0 && strcmp(fileinfo.name, "..") != 0) {
					files.push_back(p.assign(path).append("\\").append(fileinfo.name));
					//递归搜索
					getAllFiles(p.assign(path).append("\\").append(fileinfo.name), files);
				}
			}
			else {
				files.push_back(p.assign(path).append("\\").append(fileinfo.name));
			}
		} while (_findnext(hFile, &fileinfo) == 0);  //寻找下一个,成功返回0,否则-1
		_findclose(hFile);
	}
}

调用

int main(int argc, char** argv)
{
	vector<string> temp;
	getAllFiles("J:\\faces\\test", temp,".jpg");
	for (int i = 0; i < temp.size();++i	)
	{
		cout << temp[i] << endl;
	}
	return 0;
}

二、查找特定文件

自己用于查找特定文件,对上面代码做了修改

void getAllFiles(string path, vector<string>& files, string str ,string& targetFile) {
	//文件句柄
	long long hFile = 0;
	//文件信息
	struct _finddata_t fileinfo;
	string p;
	if ((hFile = _findfirst(p.assign(path).append("\\*").c_str(), &fileinfo)) != -1) {
		do {
			if ((fileinfo.attrib & _A_SUBDIR)) {  //比较文件类型是否是文件夹
				if (strcmp(fileinfo.name, ".") != 0 && strcmp(fileinfo.name, "..") != 0) {
					files.push_back(p.assign(path).append("\\").append(fileinfo.name));
					//递归搜索
					getAllFiles(p.assign(path).append("\\").append(fileinfo.name), files, str, targetFile);
				}
			}
			else {
				files.push_back(p.assign(path).append("\\").append(fileinfo.name));
				if (p.find(str) != string::npos)
				{
					targetFile = p;
				}
			}
		} while (_findnext(hFile, &fileinfo) == 0);  //寻找下一个,成功返回0,否则-1
		_findclose(hFile);
	}
}

调用

CString strpath = dlgFile.GetFolderPath();
std::string path(CW2A(strpath.GetString()));
string str = ".dat";
vector<string> vec;
string targetPath;
getAllFiles(path, vec, str, targetPath);

 奇怪的是我在删除了vec.push语句后竟然没有得到想要的结果。后面再议

2023年7月14日11:36:00更新:

另外还需要注意的是当vec是传引用的时候,vec才能存储所有的文件,这个还未细研究。

三、string和CString相互转换

一、string转CString

string str = "hello world";
CString cstr(str.c_str());


二、CString转string

CString theCStr = L"Hello C++";
std::string STDStr(CW2A(theCStr.GetString()));

四、substr()和find()函数的联合使用示例

string a = "123.456";
//al、ar分别为第一个浮点数的整数部分、小数部分
//截取字符串
string al = a.substr(0, a.find('.')); //al = "123"
string ar = a.substr(a.find('.') + 1); //ar = "456"


这个帖子的关于递归查找文件的方法还有待商榷。

今天想写的是对于十六进制txt文件的理解。

比如我用filesystem读文件模型,文件读成byte字符数组,用byte数组接收,然后转成string。在程序中一直按照string来处理。

【写到后面的时候突然发现有点不对,仔细看了代码发现byte数组转成string的时候,还用了转成16进制的方法。也就是强哥之前表述的16进制字符串。】

转换代码:

public static bytesToHex(byte[] bytes)
{
    StringBuilder sb = new StringBuilder();
    for(byte : bytes)
    {
        String temp = Interger.toHexString(0xFF & byte);
        
        //如果是个位数
        if(temp.length() < 2)
        {
            stringBuilder.append(0);
        }
        stringBuilder.append(temp.toUpperCase(Locale.ROOT));
    } 
    return stringBuilder.toString();
}

下面来看怎么写成dat文件。

但是一开始我以为convert执行完的格式是dat呢,实际不是,convert执行出来的是orc文件格式。这个关于orc暂时先不管。compile执行的过程是将编译后的数据先写成txt文件,最后又转成dat格式。

那么先看怎么写成txt格式的。就是outputdataset.write().mode(SaveMode.Overwrite).txt(outputPath);

所以txt文件里写的就是16进制字符串。而其中出现的瓦片编号是直接可阅读的。是string,直接写入,虽然不是16进制字符串,但是和16进制字符串写在了一起。

txt是16进制string字符串直接写成txt的。 

下面就是怎么写成dat文件的。

写dat文件之前是将dataset里面的16进制字符串string转换成byte数组,用的是hexToBytes()函数来处理的。

读成byte数组之后,再使用filesystem方法来写文件的。

以上就是数据不同格式

总结

提示:这里对文章进行总结:
例如:以上就是今天要讲的内容,本文仅仅简单介绍了pandas的使用,而pandas提供了大量能使我们快速便捷地处理数据的函数和方法。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值