2009-06-23 9 views
12

मैं जी की ++ अंदर मानक ftell और fseek विकल्पों का उपयोग कर पूर्णांक अतिप्रवाह में चल रहा में बड़ी फ़ाइलों को पढ़ने, लेकिन मुझे लगता है मैं गलत था, क्योंकि ऐसा लगता है कि ftell64 और fseek64 उपलब्ध नहीं हैं। मैं खोज कर रहा हूं और lseekऑफ 64_t डेटाटाइप के साथ कई वेबसाइटें संदर्भित प्रतीत होती हैं, लेकिन मुझे fseek के बराबर कुछ संदर्भ देने वाले कोई उदाहरण नहीं मिला है। फिलहाल जिन फाइलों में मैं पढ़ रहा हूं वे कम से कम दोगुनी होने की उम्मीद के साथ 16 जीबी + सीएसवी फाइलें हैं।की तलाश है और एक लिनक्स सी ++ आवेदन

किसी भी बाहरी पुस्तकालयों के बिना fseek/ftell जोड़ी के समान संरचना को प्राप्त करने के लिए सबसे सरल तरीका क्या है? मेरा आवेदन अभी 4.x के लिए मानक जीसीसी/जी ++ पुस्तकालयों का उपयोग कर काम करता है।

उत्तर

24

fseek64 एक सी फ़ंक्शन है। इसे उपलब्ध कराने के लिए आपको सिस्टम हेडर समेत _FILE_OFFSET_BITS = 64 को परिभाषित करना होगा जो वास्तव में fseek64 होने के लिए fseek को कम या कम परिभाषित करेगा। या इसे कंपाइलर तर्कों में करें उदा। जीसीसी -D_FILE_OFFSET_BITS = 64 ....

http://www.suse.de/~aj/linux_lfs.html लिनक्स पर बड़ी फाइल समर्थन का एक श्रेष्ठ overviw है:

  • "जीसीसी -D_FILE_OFFSET_BITS = 64" के साथ अपने कार्यक्रमों संकलित करें। यह 64 बिट वेरिएंट का उपयोग करने के लिए सभी फ़ाइल एक्सेस कॉल को मजबूर करता है। कई प्रकार भी बदलते हैं, उदा। off_t off64_t बन जाता है। इसलिए हमेशा सही प्रकारों का उपयोग करना और उदाहरण का उपयोग करना महत्वपूर्ण नहीं है। off_t की बजाय int। अन्य प्लेटफार्मों के साथ पोर्टेबिलिटी के लिए आपको getconf LFS_CFLAGS का उपयोग करना चाहिए जो लिनक्स प्लेटफ़ॉर्म पर -D_FILE_OFFSET_BITS = 64 लौटाएगा लेकिन उदाहरण पर कुछ और वापस कर सकता है सोलारिस। लिंक करने के लिए, आपको लिंक झंडे का उपयोग करना चाहिए जो Getconf LFS_LDFLAGS के माध्यम से रिपोर्ट की जाती है। लिनक्स सिस्टम पर, आपको विशेष लिंक झंडे की आवश्यकता नहीं है।
  • _LARGEFILE_SOURCE और _LARGEFILE64_SOURCE परिभाषित करें। इन परिभाषाओं के साथ आप सीधे LFS कार्यों जैसे ओपन 64 का उपयोग कर सकते हैं।
  • बड़ी फ़ाइलों पर काम करने के लिए ओ_LARGEFILE ध्वज का उपयोग करें।
+0

तो, मैंने आपके निर्देशों का पालन किया और सब कुछ फाइल संकलित कर रहा है। लेकिन मुझे लगता है कि अभी भी एक अतिप्रवाह हो रहा है। आप fopen64 के साथ O_LARGEFILE पैरामीटर का उपयोग कैसे करेंगे? –

+0

यदि आप -D_FILE_OFFSET_BITS = 64 के साथ संकलित करते हैं, तो O_LARGEFILE स्वचालित रूप से आपूर्ति की जाती है। यह एक मानक ध्वज नहीं है; इसका उपयोग यह ट्रैक रखने के लिए लिनक्स पर किया जाता है कि फ़ाइल को बड़ी फ़ाइल इंटरफेस के साथ खोला गया था या नहीं। – mark4o

+0

आपने प्रश्न को C++ के रूप में पूछा है, क्या आप सी ++ स्ट्रीम के साथ सी फ़ाइल ऑपरेशंस का उपयोग/मिश्रण कर रहे हैं, या आप केवल सी एपीआई का उपयोग कर रहे हैं? साथ ही, क्या आपके पास व्यवहार को पुन: उत्पन्न करने के लिए कुछ परीक्षण कोड है? यह सर्वोपरि है कि आप लंबाई/ऑफसेट से निपटने वाले सही प्रकारों का उपयोग करते हैं। – nos

5

fseek64() मानक नहीं है, संकलक दस्तावेज़ आपको यह बताने चाहिए कि उसे कहां मिलना है।

क्या आपने fgetpos और fsetpos को आजमाया है? वे बड़ी फ़ाइलों के लिए डिज़ाइन किए गए हैं और कार्यान्वयन आमतौर पर 64-बिट प्रकार का उपयोग fpos_t के आधार के रूप में करता है।

2

fsetpos(3) और fgetpos(3) का उपयोग करें। वे fpos_t डेटाटाइप का उपयोग करते हैं, जो मुझे विश्वास है कि कम से कम 64 बिट्स रखने में सक्षम होने की गारंटी है।

3

आप _FILE_OFFSET_BITS पूर्वप्रक्रमक प्रतीक करने के लिए सेट के साथ fseeko() की कोशिश की है?

यह आपको एक fseek() की तरह इंटरफ़ेस दे लेकिन प्रकार की एक ऑफसेट पैरामीटर off_tके बजाय लंबे साथ होगा। _FILE_OFFSET_BITS = 64 सेट करना एक 64-बिट प्रकार बना देगा।

ftello() के लिए जाने के लिए समान है।

9

यदि आप आईएसओ सी मानक इंटरफेस से चिपकना चाहते हैं, तो fgetpos() और fsetpos() का उपयोग करें। हालांकि, ये फ़ंक्शन केवल फ़ाइल स्थिति सहेजने और बाद में उसी स्थिति पर जाने के लिए उपयोगी होते हैं। वे fpos_t प्रकार का उपयोग कर स्थिति का प्रतिनिधित्व करते हैं, जो एक पूर्णांक डेटा प्रकार होने की आवश्यकता नहीं है। उदाहरण के लिए, रिकॉर्ड-आधारित सिस्टम पर यह एक रिकॉर्ड हो सकता है जिसमें रिकॉर्ड के भीतर एक रिकॉर्ड नंबर और ऑफसेट होता है। यह बहुत सीमित हो सकता है।

POSIX कार्यों को ftello() और fseeko() परिभाषित करता है, जो off_t प्रकार का उपयोग कर स्थिति का प्रतिनिधित्व करता है। यह एक पूर्णांक प्रकार होना आवश्यक है, और मान फ़ाइल की शुरुआत से एक बाइट ऑफसेट है। आप इसके बारे में अंकगणित कर सकते हैं, और सापेक्ष तलाश करने के लिए fseeko() का उपयोग कर सकते हैं। यह लिनक्स और अन्य पीओएसईक्स सिस्टम पर काम करेगा।

इसके अलावा, -D_FILE_OFFSET_BITS=64 (लिनक्स/सोलारिस) के साथ संकलित करें। यह off_t को long के बजाय 64-बिट प्रकार (यानी off64_t) होने के लिए परिभाषित करेगा, और उन फ़ाइलों को फिर से परिभाषित करेगा जो फ़ाइल ऑफसेट का उपयोग 64-बिट ऑफसेट लेने वाले संस्करणों के लिए करते हैं। यह डिफ़ॉल्ट है जब आप 64-बिट के लिए संकलित कर रहे हैं, इसलिए उस स्थिति में इसकी आवश्यकता नहीं है।

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