Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/128.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;没有Qt?_C++_Command Line_Filesystems_Os.path - Fatal编程技术网

C++ C++;没有Qt?

C++ C++;没有Qt?,c++,command-line,filesystems,os.path,C++,Command Line,Filesystems,Os.path,我需要设置一个目录,然后读取其中所有文件的文件名,并将整个路径存储在一个变量中。我以后需要使用这个变量来打开文件并读取它。我不想为此使用QDir。我看到了问题的第二个答案。我可以使用boost/filesystem.hpp(我相信这不需要单独下载)。但问题是执行过程将如下所示: $ g++ -o test test.cpp -lboost_filesystem -lboost_system $ ./test 由于OpenCV库的存在,我的第一行创建可执行对象已经很复杂了,我不想添加到其中。

我需要设置一个目录,然后读取其中所有文件的文件名,并将整个路径存储在一个变量中。我以后需要使用这个变量来打开文件并读取它。我不想为此使用
QDir
。我看到了问题的第二个答案。我可以使用
boost/filesystem.hpp
(我相信这不需要单独下载)。但问题是执行过程将如下所示:

$ g++ -o test test.cpp -lboost_filesystem -lboost_system
$ ./test  
由于OpenCV库的存在,我的第一行创建可执行对象已经很复杂了,我不想添加到其中。我想让它们保持简单(以下一行加上OpenCV想要的任何内容):

有什么办法吗?

这是我想编写C++代码的python代码:

root_dir = 'abc'
img_dir = os.path.join(root_dir,'subimages')

img_files = os.listdir(img_dir)
for files in img_files:
    img_name = os.path.join (img_dir,files)
    img = cv2.imread(img_name)

您可以选择使用boost、QDir、roll-Your,或者使用更新的编译器,该编译器采用了C++17的一些TR2特性。下面是一个示例,它应该使用C++17特性以与系统无关的方式大致迭代文件

#include <filesystem>
namespace fs = std::experimental::filesystem;
...
fs::directory_iterator end_iter;
fs::path subdir = fs::dir("abc") / fs::dir("subimages");
std::vector<std::string> files;

for (fs::directory_iterator dir_iter(subdir); dir_iter != end_iter; dir_iter++) {
  if (fs::is_regular_file(dir_iter->status())) {
    files.insert(*dir_iter);
  }
}
#包括
命名空间fs=std::实验::文件系统;
...
目录迭代器结束迭代器;
fs::path subdir=fs::dir(“abc”)/fs::dir(“子映像”);
std::矢量文件;
for(fs::directory\u iter dir\u iter(subdir);dir\u iter!=end\u iter;dir\u iter++){
if(fs::is_regular_file(dir_iter->status()){
文件。插入(*目录);
}
}

适用于Linux或POSIX

您可以使用低级别或&etc。。。当然,您需要处理不干净的细节(跳过
&
条目,从条目和目录路径组合文件路径,处理错误等等)。您可能还需要。 你应该阅读&以获得更广阔的视野

对于其他操作系统(尤其是Windows),您需要其他低级功能

顺便说一句,您可以查看Qt的源代码以获得
QDir


你也可以考虑使用

我想我将与Boost一起创建一个包含创建对象时应该调用的所有文件的文件。你怎么看?听起来是最可靠的方法。几年后,将不再需要将这么大的捆绑包带入像这样的小问题中。避免命名
test
您的可执行文件。它是一个标准POSIX程序
/bin/test
或shell内置程序。调用你的测试二进制文件
mytest
为什么不直接使用cv::glob?@BasileStarynkevitch我从链接中的另一个问题复制了
test
。我只是继续用它来回答剩下的问题。@Miki谢谢你的建议。看来我可以用它完成我的工作。
#include <filesystem>
namespace fs = std::experimental::filesystem;
...
fs::directory_iterator end_iter;
fs::path subdir = fs::dir("abc") / fs::dir("subimages");
std::vector<std::string> files;

for (fs::directory_iterator dir_iter(subdir); dir_iter != end_iter; dir_iter++) {
  if (fs::is_regular_file(dir_iter->status())) {
    files.insert(*dir_iter);
  }
}