如何从C或C++代码中确定目录中的文件列表?
我不允许执行ls命令并从我的程序中解析结果.
我想按照人类对它们进行排序的方式对字母数字字符串进行排序.即,"A2"出现在"A10"之前,"a"肯定出现在"Z"之前!没有编写迷你解析器,有什么办法吗?理想情况下,它也会将"A1B1"放在"A1B10"之前.我在可能的答案中看到了"Microsoft SQL 2005中的自然(人类字母 - 数字)排序"这一问题,但它使用了各种库函数,"使用IComparer为人类排序字符串"也是如此.
以下是目前失败的测试用例:
#include <set>
#include <iterator>
#include <iostream>
#include <vector>
#include <cassert>
template <typename T>
struct LexicographicSort {
inline bool operator() (const T& lhs, const T& rhs) const{
std::ostringstream s1,s2;
s1 << toLower(lhs); s2 << toLower(rhs);
bool less = s1.str() < s2.str();
//Answer: bool less = doj::alphanum_less<std::string>()(s1.str(), s2.str());
std::cout<<s1.str()<<" "<<s2.str()<<" "<<less<<"\n";
return less;
}
inline std::string toLower(const std::string& str) const {
std::string newString("");
for (std::string::const_iterator charIt = str.begin();
charIt!=str.end();++charIt) { …Run Code Online (Sandbox Code Playgroud) 我使用 MSVC2015 为 windows 编写了一个解决方案,其中以下代码转换 std::filesystem::last_write_time 结果 time_t:
time_t ftime = std::file_time_type::clock::to_time_t(fs::last_write_time("/Path/filename"))
Run Code Online (Sandbox Code Playgroud)
它运作良好。然后,当我尝试使用 gcc 9.3 (-std=C++2a) 将解决方案移植到 Linux 时,出现以下错误:
错误:'to_time_t' 不是 'std::chrono::time_point::clock' {aka 'std::filesystem::__file_clock'} 的成员
我搜索了一个解决方案,但我发现是基于解决方案包括上例中的std ::文件系统:: last_write_time在cplusplus.com。解决方法如下图:
auto ftime = fs::last_write_time(p);
std::time_t cftime = decltype(ftime)::clock::to_time_t(ftime);
Run Code Online (Sandbox Code Playgroud)
不幸的是,它对我不起作用。实际上,该示例有一条评论说它不适用于 MSVC(曾在 MSVC2015 上工作)或 GCC 9;C++20 将允许便携式输出。
现在,我被卡住了……我怎样才能使用 gcc 进行这种转换?