2010-11-11 14 views
10

मैं निम्नलिखित की तरह कुछ करते हैं:मैं ऑपरेटर के साथ fstream के बाइनरी डेटा क्यों नहीं पढ़ सकता?

ifstream file; 
file.open("somefile", ios::binary); 

unsigned int data; 

file >> data; 

मेरे धारा हमेशा failbit सेट हो जाएगा और data अप्रारंभीकृत रहेगा। हालांकि, अगर मैं char या unsigned char पढ़ता हूं, तो स्ट्रीम ठीक है। perror() मुझे "परिणाम बहुत बड़ा" बता रहा है।

केवल एक चीज मैं गूगल पर देखा एक सुझाव कह रही है कि operator>> बाइनरी डेटा (पसंद करते हैं read()) के लिए नहीं किया जाना चाहिए था, लेकिन मैं उपयोग करने के लिए स्वच्छ और आसान हो करने के लिए ऑपरेटर को खोजने के - और यह की आवश्यकता नहीं है सब कुछ कास्टिंग।

क्या कोई इस मुद्दे को समझा सकता है?

उत्तर

10

iostream extraction operator (>>) बाइटरी डेटा से नहीं, सफेद जगह से अलग संख्यात्मक तारों को समझने का प्रयास करता है। द्विआधारी रूप में एक हस्ताक्षरित पूर्णांक को एन्कोड करने के कई अलग-अलग तरीके हैं (उदाहरण के लिए 32-बिट 2's complement representationlittle-endian byte order में)। यही कारण है कि आपको ऐसे बाइनरी बफर पर काम करने के लिए read/write फ़ंक्शंस का उपयोग करना होगा।

हालांकि, सम्मिलन और निष्कर्षण ऑपरेटरों का उपयोग करने के लिए आप जो भी रूप चाहते हैं, बाइनरी डेटा को क्रमबद्ध करने के लिए आपको अपनी कक्षा को लागू करने से रोकता है। ऐसी कक्षा संभवतया एक आईफस्ट्रीम ऑब्जेक्ट के पढ़ने के फ़ंक्शन का उपयोग करेगी। वैकल्पिक रूप से, boost serialization library पहले से ही वही हो सकता है जो आप चाहते हैं।

0

यह आपके द्वारा वर्णित अनुसार किया जाना चाहिए। हालांकि, सी ++ मानक डिजाइनर बहुत ही सुरुचिपूर्ण नहीं हैं। वास्तव में, सी ++ के डिजाइन में बहुत सी त्रुटियां हैं, यहां तक ​​कि सी ++ 11 और सी ++ 14 में बहुत सारे दोष हैं।

आदर्श सी ++ डिजाइन किया जाना चाहिए कि:

1. पाठ फ़ाइल:

ifstream fin_txt("input.txt"); 
int i; 
float j; 
double k; 
fin_txt >> i >> j >> k; 

यह 3 तार में पढ़ सकते हैं और पूर्णांक, नाव और डबल में पार्स और उन्हें में संग्रहीत करेगा क्रमशः i, j, और k।

2. बाइनरी फ़ाइल:

ifstream fin_txt("input.bin", ios::binary); 
int i; 
float j; 
double k; 
fin_txt >> i >> j >> k; 

यह 4 बाइट और 8 बाइट्स बाइनरी डेटा (पूर्णांक 32-बिट या 64-बिट है कि क्या के आधार पर) 4/8 बाइट में पढ़ सकते हैं और उन्हें स्टोर करेगा क्रमशः i, j, और k में।

दुर्भाग्यवश, वर्तमान डिज़ाइन केस 2 के लिए त्रुटि की रिपोर्ट करना है। शायद यह C++ 22 में प्राप्त किया जा सकता है।

+0

आपके पास यह कारण है कि यह आपके उत्तर में क्यों है: "यह निर्भर करता है कि int 32-बिट या 64-बिट है या नहीं।" वर्तमान में, '' का उपयोग कर कोड पोर्टेबल है, आपका प्रस्ताव नहीं है। – Caleth

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