C++のファイルを扱うdirectory_iteratorクラスについて質問させていただきます。
(私の環境は、windowsにMinGW(minimalist gnu for windows)をインストールしています)
C++ 日本語referenceによると、サンプルコードは
https://cpprefjp.github.io/reference/filesystem/directory_iterator.html
lang
1#include <iostream> 2#include <filesystem> 3#include <fstream> 4 5namespace fs = std::filesystem; 6 7int main() 8{ 9 fs::create_directory("dir_a"); 10 std::ofstream{"dir_a/a.txt"}; 11 12 fs::create_directory("dir_a/dir_b"); 13 std::ofstream{"dir_a/dir_b/b.txt"}; 14 15 // dir_aディレクトリ直下に含まれる全ファイルを出力 16 for (const fs::directory_entry& x : fs::directory_iterator("dir_a")) { 17 std::cout << x.path() << std::endl; 18 } 19}
のあり、私の環境で正常に動作しました。
- この中の、
directory_iterator("dir_a")
は、どのようにコンストラクタがよばれているのか(headerファイルのどのコンストラクタに当たるのか)教えていただけると幸いです。
2. あと、範囲for文は
lang
1{ 2 auto && __range = for-range-initializer; 3 for (auto __begin = __range.begin(), __end = __range.end(); __begin != __end; ++__begin) { 4 for-range-declaration = *__begin; 5 statement 6 } 7}
初心者なので、的外れな質問かもしれませんが、どうか回答よろしくお願いします
mingwでdirecory_iteratorが定義されているヘッダファイル
(lib\gcc\mingw32\9.2.0\include\c++\bits\fs_dir.h,一部改行を削除)
lang
1class directory_iterator{ 2 public: 3 typedef directory_entry value_type; 4 typedef ptrdiff_t difference_type; 5 typedef const directory_entry* pointer; 6 typedef const directory_entry& reference; 7 typedef input_iterator_tag iterator_category; 8 directory_iterator() = default; 9 explicit 10 directory_iterator(const path& __p) 11 : directory_iterator(__p, directory_options::none, nullptr) { } 12 directory_iterator(const path& __p, directory_options __options) 13 : directory_iterator(__p, __options, nullptr) { } 14 directory_iterator(const path& __p, error_code& __ec) 15 : directory_iterator(__p, directory_options::none, __ec) { } 16 directory_iterator(const path& __p, directory_options __options, 17 error_code& __ec) 18 : directory_iterator(__p, __options, &__ec) { } 19 directory_iterator(const directory_iterator& __rhs) = default; 20 directory_iterator(directory_iterator&& __rhs) noexcept = default; 21 ~directory_iterator() = default; 22 directory_iterator& 23 operator=(const directory_iterator& __rhs) = default; 24 directory_iterator& 25 operator=(directory_iterator&& __rhs) noexcept = default; 26 const directory_entry& operator*() const noexcept; 27 const directory_entry* operator->() const noexcept { return &**this; } 28 directory_iterator& operator++(); 29 directory_iterator& increment(error_code& __ec); 30 __directory_iterator_proxy operator++(int) 31 { 32 __directory_iterator_proxy __pr{**this}; 33 ++*this; 34 return __pr; 35 } 36 private: 37 directory_iterator(const path&, directory_options, error_code*); 38 friend bool 39 operator==(const directory_iterator& __lhs, 40 const directory_iterator& __rhs) noexcept 41 { 42 return !__rhs._M_dir.owner_before(__lhs._M_dir) 43 && !__lhs._M_dir.owner_before(__rhs._M_dir); 44 } 45 friend bool 46 operator!=(const directory_iterator& __lhs, 47 const directory_iterator& __rhs) noexcept 48 { return !(__lhs == __rhs); } 49 friend class recursive_directory_iterator; 50 std::__shared_ptr<_Dir> _M_dir; 51 };
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2022/03/30 23:50
2022/03/31 07:44
2022/03/31 11:10
2022/03/31 13:18
2022/03/31 22:11
2022/03/31 23:54
2022/04/02 02:58