2012-02-03 12 views
7

एक प्रोजेक्ट में, मुझे एक फ़ाइल पढ़नी है, और मुझे फ़ाइल में वर्णों की संख्या के साथ काम करना है, और क्या कोई संख्या प्राप्त करने का कोई तरीका है पात्रों द्वारा चरित्र को पढ़ने के बिना वर्ण (अन्यथा मुझे इसमें दो बार फ़ाइल को पढ़ना होगा, एक बार बस इसमें वर्णों की संख्या को ढूंढने के लिए)।सामग्री को घुमाने के बिना फ़ाइल में वर्णों की संख्या कैसे प्राप्त करें

क्या यह भी संभव है?

+0

शुद्ध मानक सी ++ में, या ऑपरेटिंग सिस्टम विशिष्ट एपीआई ठीक है? गैर पोर्टेबल फ़ंक्शन हैं (उदाहरण के लिए ['GetFileSizeEx()'] (http://msdn.microsoft.com/en-us/library/windows/desktop/aa364957 (v = vs.85) .aspx)) प्राप्त करने के लिए फाइलों का आकार। –

+0

आपका मतलब फ़ाइल का आकार प्राप्त करना है? –

+0

वैसे यह होमवर्क है और मुझे एपीआई का उपयोग करने की अनुमति नहीं है। मुझे केवल iostream और fstream फ़ंक्शंस का उपयोग करने की अनुमति है। तार भी नहीं। – SpeedBirdNine

उत्तर

8

आप इस कोशिश कर सकते हैं:

FILE *fp = ... /*open as usual*/; 
fseek(fp, 0L, SEEK_END); 
size_t fileSize = ftell(fp); 

हालांकि, इस फ़ाइल में बाइट्स, नहीं पात्रों की संख्या की संख्या देता है। यह तब तक नहीं है जब तक एन्कोडिंग प्रति बाइट एक बाइट (उदा। ASCII) के रूप में जाना जाता है।

आप शुरुआत करने के लिए वापस फ़ाइल "रिवाइंड करने के लिए" आप सीखा है के बाद आकार आवश्यकता होगी: तो फ़ाइल आकार और विभाजन पर एक नजर है है

fseek(fp, 0L, SEEK_SET); 
+0

धन्यवाद मदद के लिए बहुत कुछ! – SpeedBirdNine

+0

यूटीएफ -8 एक चर लंबाई लंबाई कोडिंग है। –

+1

@ AndréCaron सुधार के लिए धन्यवाद! – dasblinkenlight

1

मुझे लगता है कि आप गतिशील स्मृति समाधान की तलाश कर रहे हैं। आपने वास्तव में क्या पूछा है "क्या इसे पढ़ने के बिना फाइलों में वर्णों की संख्या प्राप्त करने का कोई तरीका है?"। उत्तर (प्रति चरित्र एक बाइट मानना) हां है, आप फ़ाइल आकार प्राप्त करने के लिए stat कॉल का उपयोग कर सकते हैं, और बाइट्स में फ़ाइल आकार वर्णों की संख्या है। यूटीएफ -8 के साथ जवाब नहीं है, लेकिन चलिए इस पल के लिए इस पल के लिए एक तरफ रख दें क्योंकि कंप्यूटर सीखने वाले आमतौर पर अंतर्राष्ट्रीयकरण के बारे में चिंता नहीं करते हैं।

मुझे लगता है कि आप जानना चाहते हैं कि कितने पात्र हैं ताकि आप उन्हें सभी को पकड़ने के लिए पर्याप्त भंडारण कर सकें। आपको यह जानने की जरूरत नहीं है कि पूरी चीज़ को स्टोर करने के लिए फ़ाइल कितनी बड़ी है।

यदि आपके पास std::vector<char> है, तो यह दस अक्षरों को पकड़ने में सक्षम हो सकता है, फिर बीस, फिर दस हजार पकड़ने के लिए बढ़ सकता है ... और जब आप फ़ाइल पढ़ रहे हैं, तो यह उन्हें सभी को पकड़ देगा, भले ही आप कभी नहीं जानते थे कि कितने होंगे।

1

मेरे सिर के ऊपर बंद कि कितने बाइट्स एक वर्ण है?

समस्याएं पैदा होती है जब सफेद स्थान और अंत लाइनों आदि

11

हाँ गिर्द घूमती है।

अंत में खोजें अंत आकार की स्थिति प्राप्त करें।

std::ifstream file("Plop"); 
file.seekg(0, std::ios_base::end); 
size_t size = file.tellg(); 

file.seekg(0, std::ios_base::beg); 
+0

धन्यवाद, आपका और स्वीकृत उत्तर दोनों समान रूप से सहायक थे, मैंने एक को अधिक वोट के साथ चुना। एक बार जवाब के लिए बहुत बहुत धन्यवाद! – SpeedBirdNine

1

सरल उत्तर है नहीं:

FILE* file = fopen("Plop"); 
fseek(file, 0, SEEK_END); 
size_t size = ftell(file);  // This is the size of the file. 
           // But note it is in bytes. 
           // Also note if you are reading it into memory this is 
           // is the value you want unless you plan to dynamically 
           // convert the character encoding as you read. 

fseek(file, 0, SEEK_SET);  // Move the position back to the start. 

सी ++ में धारा ही कार्यक्षमता है। अधिक सटीक, यह सिस्टम निर्भर है: यूनिक्स के तहत, यह संभव है (उदा। stat का उपयोग करना); विंडोज के तहत, यह टेक्स्ट फ़ाइल के लिए संभव नहीं है, लेकिन यदि आप बाइनरी में फ़ाइल पढ़ रहे हैं, पर कोई फ़ंक्शन GetFileSize है जिसका उपयोग किया जा सकता है।

हालांकि कार्यान्वयन मुझे पता है ( के लिए इन दो प्लेटफार्मों) के सभी के तहत, इसकी गारंटी नहीं, फ़ाइल के अंत की मांग है, तो एक ftell कर रही है, कुछ वापस आ जाएगी, जो जब एक पर्याप्त बड़े अभिन्न करने के लिए परिवर्तित टाइप करें, उपरोक्त के समान परिणाम देगा ( समान प्रतिबंधों के साथ)।

अंत में: आपको इस जानकारी की आवश्यकता क्यों है? यदि यह उचित रूप से आकार का बफर आवंटित करने के लिए है, तो टेक्स्ट फ़ाइल के साथ, GetFileSize (और tell अंत करने के बाद) एक बाइट्स की संख्या से थोड़ा अधिक वापस लौटाएगा। आप बफर थोड़ा oversized हो जाएगा, लेकिन यह आमतौर पर एक समस्या नहीं है।

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

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