c - Reading a struct through low level I/O -
एक प्रयोगशाला के लिए हमें निम्न स्तर IO (open / lseek / close / fopen / fseek बंद नहीं) का उपयोग करते हुए बाइनरी फ़ाइलों से पढ़ने की आवश्यकता है / एफकॉओज़) और डेटा में हेरफेर करें। मेरा प्रश्न यह है कि मैं इन विधियों का उपयोग करके स्ट्रैक्ट्स कैसे पढ़ता / लिखता हूं।
इस प्रकार संरचना निम्नानुसार है
typedef struct एंट्री {char title [33]; चार कलाकार [17]; इंट वैल; इंट लागत; } Entry_T;
मैं मूल रूप से sizeof (Entry_T)
के बफ़र बनाने की योजना बनाई थी और संरचना को बस पढ़ा, लेकिन मुझे नहीं लगता कि निम्न स्तर I / O का प्रयोग करना संभव है । क्या मैं 4 बफ़र्स बनाने और क्रमिक रूप से उन्हें भरने वाला हूँ, एक बफर का उपयोग करें और इसे सही आकार के लिए पुन: निर्दिष्ट करें, या यह पूरी तरह से कुछ और है लिखने का एक उदाहरण भी सहायक होगा, लेकिन मुझे लगता है कि मैंने पढ़ा उदाहरण देखने के बाद इसे समझने में सक्षम हो सकता है।
क्योंकि आपके संरचनाओं में कोई संकेत नहीं होता है और सभी तत्व निश्चित आकार होते हैं, तो आप संरचनाओं को केवल लिख और पढ़ सकते हैं संक्षेप के लिए छोड़ी गई त्रुटि की जांच:
const char * filename = "..."; Int fd = ओपन (फ़ाइल नाम, O_RDWR | O_CREAT, 0644); Entry_t ent1 = {"स्पैनिश ट्रेन", "क्रिस डी बर्ग", 100, 30}; Ssize_t w_bytes = लिखें (एफडी, और एंट 1, आकारफ (एंट 1)); Lseek (एफडी, 0 एल, SEEK_SET); Entry_t ent2; Ssize_t r_bytes = पढ़ें (एफडी, और एंट 2, आकारफ (एंट 2)); जोर देकर (w_bytes == r_bytes); जोर दें (w_bytes == आकारफ (एंट 1)); ज़ोर देना (strcmp (ent1.title, ent2.title) == 0); जोर देना (एसआरसीएमपी (एंट 1। एर्टिस्ट, एंट 2। स्टार्टिस्ट) == 0); जोर दें (ent1.val == ent2.val & amp; ent1.cost == ent2.cost); करीब (FD);
यदि आपके संरचनाओं में पॉइंटर्स या चर लंबाई वाले सदस्य (लचीले सरणी सदस्य) होते हैं, तो आपको कड़ी मेहनत करनी होगी।
इस तरह से लिखी गई डेटा पोर्टेबल नहीं है जब तक कि सभी डेटा तार में है यदि आप किसी बड़े-एंडियन और छोटी-एंडियन मशीन के बीच डेटा को स्थानांतरित करते हैं, तो एक तरफ यह गलत समझा जाएगा कि दूसरे व्यक्ति जो सोचते हैं, वह लिखा है। इसी प्रकार, एक मशीन आर्किटेक्चर पर 32-बिट और 64-बिट के बीच डेटा को स्थानांतरित करते समय समस्या हो सकती है (उदाहरण के लिए, यदि आपके पास लंबे समय से
डेटा है, उदाहरण के लिए, 32-बिट सिस्टम शायद इसका उपयोग करता है आकारफ़ (लंबी) == 4)
लेकिन 64-बिट सिस्टम शायद आकार (लंबे) == 8
& mdash; जब तक कि आप Windows पर नहीं हैं।
Comments
Post a Comment