Мне нужно установить каталог, а затем прочитать все имена файлов внутри и сохранить весь путь в переменной. Мне нужно использовать эту переменную позже, чтобы открыть файл и прочитать его. Я не хочу использовать QDir
за это. Я видел второй ответ на вопрос Вот. я могу использовать boost/filesystem.hpp
(Я считаю, что это не нужно загружать отдельно). Но проблема в том, что исполнение будет выглядеть так:
$ g++ -o test test.cpp -lboost_filesystem -lboost_system
$ ./test
Моя первая строка для создания исполняемого объекта уже сложна из-за библиотек OpenCV, и я не хочу добавлять к этому. Я хочу, чтобы они были простыми (следующая строка плюс все, что хочет OpenCV):
g++ -o test test.cpp
Есть ли способ сделать это?
Это код Python, для которого я хочу написать код C ++:
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, свернуть свой собственный или использовать более новый компилятор, который принял некоторые функции TR2, подготовленные для C ++ 17. Ниже приведен пример, который примерно должен перебирать файлы независимо от системы с помощью функции 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);
}
}
Для Linux или POSIX ….
Вы можете использовать низкий уровень nftw (3) или же opendir (3) & READDIR (3) и т.д. … Конечно, вам придется иметь дело с грязными деталями (пропуская .
& ..
записи, сборка пути к файлу из записи и пути к каталогу, обработка ошибок и т. д.). Вам также может понадобиться стат (2).
Вы должны прочитать Расширенное программирование в Linux & Системные вызовы (2) чтобы получить более широкое представление.
Для других ОС (особенно Windows) вам нужны другие низкоуровневые функции.
Кстати, вы можете посмотреть в исходный код Qt для QDir
Вы также можете рассмотреть возможность использования ПОКО