इसलिए मैंने बूस्ट फाइल सिस्टम को आजमाने के लिए एक छोटा प्रोग्राम लिखा। मेरा प्रोग्राम लिखेगा कि वर्तमान पथ में कितनी फाइलें हैं और फिर फ़ाइल नाम। यहाँ मेरा कार्यक्रम है:

#include <iostream>
#include <boost/filesystem.hpp>

using namespace boost::filesystem;

int main(){
    directory_iterator start = directory_iterator(current_path());
    directory_iterator di = start;
    int count;
    for (count = 0; di != directory_iterator(); ++di, ++count);
    std::cout << std::endl << "total number of files: " << count << std::endl;
    di = start;
    for (; di != directory_iterator(); ++di){
        std::cout << *di << std::endl;
    }
    return 0;
}

मौजूदा फ़ाइलें प्रोग्राम.exe, .ilk और .pdb हैं
हालांकि मुझे निम्न आउटपुट मिलता है (संक्षिप्तता के लिए पूरा पथ छोड़ दिया गया है):

$ program.exe
फाइलों की कुल संख्या: 3
[..]/कार्यक्रम.pdb
अभिकथन विफल: m_imp->m_handle! = 0 && "आंतरिक प्रोग्राम त्रुटि", फ़ाइल c:\program files\boost\boost_1_44\boost\filesystem\v2\operations.hpp, लाइन 1001

अगर मैं इसके बजाय एक नई निर्देशिका_इटरेटर करता हूं तो यह ठीक काम करता है:

di = start;
// .. becomes ..
di = directory_iterator(current_path());

मैंने एक इसी तरह के प्रश्न को directory_iterators से संबंधित देखा है, लेकिन मेरे पास कोई नहीं है विचार करें कि वे क्या कह रहे हैं या यदि यह वही मुद्दा है।

प्रश्न है: मैं एक प्रारंभकर्ता को क्यों नहीं सहेज सकता और फिर उसका उपयोग अपने पुनरावर्तक को रिवाइंड करने के लिए क्यों नहीं कर सकता?

4
Default 18 जून 2011, 17:47
दूसरे प्रश्न का उत्तर हमें पहले ही बता देता है कि समस्या क्या है - निर्देशिका इटरेटर एक पास इटरेटर है। आप एक प्रति सहेज कर दूसरा पास नहीं कर सकते।
 – 
Bo Persson
18 जून 2011, 17:53
का संभावित डुप्लिकेट ?
 – 
Bo Persson
18 जून 2011, 17:54
कि आप एक कॉपी का उपयोग नहीं कर सकते। यदि आप दो बार ट्रैवर्स करना चाहते हैं, तो आपको दो इटरेटर बनाने की आवश्यकता है (और जोखिम है कि फाइलों की संख्या बदल गई है)।
 – 
Bo Persson
18 जून 2011, 18:00

1 उत्तर

सबसे बढ़िया उत्तर

यह वही मुद्दा है।

निर्देशिका इटरेटर एक पास इटरेटर है। आप एक प्रति सहेज कर दूसरा पास नहीं कर सकते। हर बार जब आप इटरेटर को बढ़ाते हैं तो आपको अगली प्रविष्टि मिलती है, लेकिन आप इसे घटा नहीं सकते हैं और आप वापस नहीं जा सकते हैं और फिर से शुरू नहीं कर सकते हैं, भले ही आपने शुरुआती बिंदु की एक प्रति सहेजी न हो।

यदि आप दो बार ट्रैवर्स करना चाहते हैं, तो आपको एक और इटरेटर बनाना होगा (और जोखिम है कि फाइलों की संख्या बदल गई है)।

1
Bo Persson 4 जुलाई 2011, 17:01