2013-05-06 8 views
6

मैंने एक बार फ़ाइल के माध्यम से लाइनों की संख्या को खोजने के लिए पढ़ा है, फिर इसे फिर से पढ़ें ताकि मैं प्रत्येक पंक्ति के कुछ डेटा को सरणी में संग्रहीत कर सकूं। फाइल को दोबारा बंद करने और इसे खोलने से दो बार पढ़ने का बेहतर तरीका है? यहां मुझे जो मिला है, लेकिन मुझे डर है कि यह अक्षम है।एक ही फ़ाइल को पंक्ति में दो बार पढ़ने के लिए

int numOfMappings = 0; 
ifstream settingsFile("settings.txt"); 
string setting; 
while(getline(settingsFile, setting)) 
{ 
    numOfMappings++; 
} 
char* mapping = new char[numOfMappings]; 
settingsFile.close(); 
cout << "numOfMappings: " << numOfMappings << endl; 
settingsFile.open("settings.txt"); 
while(getline(settingsFile, setting)) 
{ 
    cout << "line: " << setting << endl; 
} 
+2

SInce आप C++ का उपयोग कर रहे हैं, तो आप किसी सरणी के बजाय 'वेक्टर' का उपयोग कर सकते हैं: http://www.cplusplus.com/reference/vector/ – Patashu

+0

जानकारी संग्रहीत करने के लिए 'वेक्टर <> 'का उपयोग क्यों न करें जैसा कि आप इसे फ़ाइल से पहली बार पढ़ते हैं - वेक्टर स्वचालित रूप से आकार बदल जाएगा क्योंकि इसे और अधिक स्मृति की आवश्यकता है। –

+0

एक नज़र डालें [यहां] (http://en.cppreference.com/w/cpp/io/basic_ostream/seekp)। शायद [यहां] (http://en.cppreference.com/w/cpp/io/basic_istream/seekg) वास्तव में। – ChiefTwoPencils

उत्तर

16
settingsFile.clear(); 
settingsFile.seekg(0, settingsFile.beg); 
0

बस का उपयोग करें:

settingsFile.seekg(0, settingsFile.beg); 

यह बहुत शुरुआत करने के लिए फ़ाइल सूचक रिवाइंड तो आप इसे फिर से बंद करने और फिर से खोलने के बिना पढ़ सकते हैं होगा।

+3

कोई ऐसा उत्तर देखने में अच्छा लगा जो वास्तव में किसी भी सरणी को देखता है - "... वेक्टर ..."। +1 – ChiefTwoPencils

+0

यह काम नहीं करता है। 'जबकि (गेटलाइन (सेटिंग्सफाइल, सेटिंग))' कभी नहीं होता है। – Celeritas

+2

@Celeritas ऐसा इसलिए है क्योंकि eofbit अभी भी सेट है। लूप से पहले file.clear() पर कॉल करें। – jrok

3

यह अक्षम है, std::vector का उपयोग करें और केवल एक बार फ़ाइल के माध्यम से पढ़ें।

vector<string> settings; 
ifstream settingsFile("settings.txt"); 
string setting; 
while (getline(settingsFile, setting)) 
{ 
    settings.push_back(setting); 
} 
+1

फ़ाइल बहुत बड़ी है और वेक्टर – mvp

+3

@mvp में फिट नहीं होगा, यह विधि का उपयोग करने के लिए उचित नहीं हो सकता है: यह एक सरणी के लिए भी सच है। –

3

फ़ाइल वापस इसकी शुरुआत करने के लिए रिवाइंड करने के लिए (उदाहरण के लिए इसे फिर से पढ़ने के लिए) आप ifstream::seekg() का उपयोग कर्सर और ifstream::clear() की स्थिति बदलने के लिए कर सकते हैं सब आंतरिक त्रुटि झंडे पुनर्स्थापित करने के लिए (अन्यथा यह आप पर अभी भी कर रहे हैं दिखाई देगा फ़ाइल का अंत)।

दूसरे, आप केवल एक बार फ़ाइल को पढ़ने और भंडारण क्या आप एक अस्थायी std::deque या std::list में पता करने के लिए जब तुम फ़ाइल को पार्स की जरूरत पर विचार करना चाहते हो सकता है। इसके बाद आप अस्थायी कंटेनर से एक सरणी (या std::vector) बना सकते हैं, यदि आपको बाद में उस विशिष्ट कंटेनर की आवश्यकता होगी।

संबंधित मुद्दे