सी रैंडम एक्सेस फ़ाइल हैंडलिंग पर प्रोग्रामिंग ट्यूटोरियल

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

प्रोग्रामिंग रैंडम एक्सेस फ़ाइल I / O C में

बाइनरी फ़ाइल
डी 3 डीमन / गेटी इमेजेज

मूल फ़ाइल संचालन हैं:

  • fopen - एक फ़ाइल खोलें- निर्दिष्ट करें कि यह कैसे (रीड / राइट) खोला गया है और टाइप करें (बाइनरी / टेक्स्ट)
  • fclose - एक खोली गई फ़ाइल को बंद करें
  • fread - एक फ़ाइल से पढ़ें
  • fwrite - किसी फ़ाइल में लिखें
  • fseek / fsetpos - फ़ाइल पॉइंटर को किसी फ़ाइल में कहीं ले जाएं
  • ftell / fgetpos - आपको बताता है कि फ़ाइल पॉइंटर कहाँ स्थित है

दो मौलिक फ़ाइल प्रकार पाठ और हैं द्विआधारी। इन दोनों में से, बाइनरी फाइलें आमतौर पर निपटने के लिए सरल होती हैं। उस कारण और इस तथ्य के लिए कि पाठ फ़ाइल पर रैंडम एक्सेस कुछ ऐसा नहीं है जिसे आपको अक्सर करने की आवश्यकता होती है, यह ट्यूटोरियल बाइनरी फाइलों तक सीमित है। ऊपर सूचीबद्ध पहले चार ऑपरेशन टेक्स्ट और रैंडम एक्सेस फाइल दोनों के लिए हैं। पिछले दो सिर्फ यादृच्छिक पहुँच के लिए।

instagram viewer

रैंडम एक्सेस का मतलब है कि आप किसी फाइल के किसी भी हिस्से में जा सकते हैं और पूरी फाइल को पढ़े बिना उसमें से डेटा पढ़ या लिख ​​सकते हैं। वर्षों पहले, कंप्यूटर टेप के बड़े रीलों पर डेटा संग्रहीत किया गया था। टेप पर एक बिंदु तक पहुंचने का एकमात्र तरीका टेप के माध्यम से सभी तरह से पढ़ना था। फिर डिस्क साथ आए और अब आप किसी फ़ाइल के किसी भी हिस्से को सीधे पढ़ सकते हैं।

बाइनरी फ़ाइलों के साथ प्रोग्रामिंग

एक बाइनरी फ़ाइल किसी भी लम्बाई की फ़ाइल है जो 0 से 255 तक की रेंज में मानों के साथ बाइट्स रखती है। इन बाइट्स का टेक्स्ट फाइल के विपरीत कोई अन्य अर्थ नहीं है, जहां 13 का मान गाड़ी का रिटर्न, 10 का मतलब लाइन फीड और 26 का मतलब फाइल का अंत है। सॉफ्टवेयर रीडिंग टेक्स्ट फाइल को इन अन्य अर्थों से निपटना पड़ता है।

बाइनरी फाइलें बाइट्स की एक धारा और आधुनिक भाषाएं फाइलों के बजाय धाराओं के साथ काम करती हैं। महत्वपूर्ण हिस्सा डेटा स्ट्रीम है बजाय इसके कि यह कहाँ से आया है। में सी, आप फ़ाइलों या धाराओं के रूप में डेटा के बारे में सोच सकते हैं। रैंडम एक्सेस के साथ, आप फ़ाइल या स्ट्रीम के किसी भी हिस्से को पढ़ या लिख ​​सकते हैं। अनुक्रमिक पहुंच के साथ, आपको फ़ाइल के माध्यम से लूप करना होगा या एक बड़े टेप की तरह शुरुआत से स्ट्रीम करना होगा।

यह कोड नमूना एक साधारण बाइनरी फ़ाइल को लिखने के लिए खोला जाता है, जिसमें एक टेक्स्ट स्ट्रिंग (चार *) लिखा होता है। आम तौर पर आप इसे टेक्स्ट फाइल के साथ देखते हैं, लेकिन आप बाइनरी फाइल को टेक्स्ट लिख सकते हैं।

यह उदाहरण लिखने के लिए एक बाइनरी फ़ाइल खोलता है और फिर इसमें एक चार * (स्ट्रिंग) लिखता है। File * वैरिएबल को fopen () कॉल से लौटाया जाता है। यदि यह विफल रहता है (फ़ाइल मौजूद हो सकती है और खुली हो या केवल पढ़ने के लिए या फ़ाइल नाम के साथ कोई दोष हो सकता है), तो यह 0 देता है।

फ़ोपेन () कमांड निर्दिष्ट फ़ाइल को खोलने का प्रयास करता है। इस स्थिति में, यह अनुप्रयोग के समान फ़ोल्डर में test.txt है। यदि फ़ाइल में पथ शामिल है, तो सभी बैकस्लैश को दोगुना करना होगा। "c: \ folder \ test.txt" गलत है; आपको "c: \\ folder \\ test.txt" का उपयोग करना चाहिए।

जैसा कि फ़ाइल मोड "wb" है, यह कोड एक बाइनरी फ़ाइल को लिख रहा है। यदि यह मौजूद नहीं है, तो फ़ाइल बनाई जाती है, और यदि यह होती है, तो इसमें जो कुछ भी था वह हटा दिया गया है। यदि फ़ोपेन पर कॉल विफल हो जाता है, तो शायद क्योंकि फ़ाइल खुली थी या नाम में अमान्य वर्ण या अमान्य पथ है, फ़ोपेन मान 0 देता है।

हालाँकि, आप केवल गैर-शून्य (सफलता) होने के लिए जाँच कर सकते हैं, इस उदाहरण में स्पष्ट रूप से ऐसा करने के लिए एक फ़ाइलशूट () फ़ंक्शन है। विंडोज पर, यह कॉल और फ़ाइल नाम की सफलता / विफलता को आउटपुट करता है। यदि आप प्रदर्शन के बाद हैं तो यह थोड़ा खराब है, इसलिए आप इसे डीबगिंग तक सीमित कर सकते हैं। विंडोज पर, सिस्टम डीबगर के लिए पाठ का उत्पादन बहुत कम होता है।

फ़ॉरराइट () कॉल निर्दिष्ट पाठ को आउटपुट देता है। दूसरा और तीसरा पैरामीटर वर्णों का आकार और स्ट्रिंग की लंबाई है। दोनों को size_t के रूप में परिभाषित किया गया है जो कि अहस्ताक्षरित पूर्णांक है। इस कॉल का परिणाम निर्दिष्ट आकार की गणना आइटम लिखना है। ध्यान दें कि बाइनरी फ़ाइलों के साथ, भले ही आप एक स्ट्रिंग (चार *) लिख रहे हों, यह किसी भी गाड़ी के रिटर्न या लाइन फीड वर्णों को संलग्न नहीं करता है। यदि आप उन्हें चाहते हैं, तो आपको उन्हें स्ट्रिंग में स्पष्ट रूप से शामिल करना चाहिए।

फाइल पढ़ने और लिखने के लिए फाइल मोड

जब आप एक फ़ाइल खोलते हैं, तो आप यह निर्दिष्ट करते हैं कि इसे कैसे खोला जाना है - चाहे इसे नए से बनाएं या इसे अधिलेखित करें और चाहे यह पाठ या द्विआधारी हो, पढ़े या लिखे और यदि आप इसे संलग्न करना चाहते हैं। यह एक या एक से अधिक फ़ाइल मोड निर्दिष्टियों का उपयोग करके किया जाता है जो अन्य अक्षरों के साथ संयोजन में एकल अक्षर "आर", "बी", "डब्ल्यू", "ए" और "+" हैं।

  • r - पढ़ने के लिए फ़ाइल खोलता है। यह विफल रहता है अगर फ़ाइल मौजूद नहीं है या नहीं मिल सकती है।
  • w - फाइल को लिखने के लिए खाली फाइल के रूप में खोलता है। यदि फ़ाइल मौजूद है, तो इसकी सामग्री नष्ट हो जाती है।
  • a - फ़ाइल के नए डेटा को लिखने से पहले EOF मार्कर को हटाए बिना फ़ाइल के अंत में फ़ाइल को जोड़ना (जोड़ना); यदि यह मौजूद नहीं है तो यह पहली बार फाइल बनाता है।

फ़ाइल मोड में "+" जोड़ने से तीन नए मोड बनते हैं:

  • r + - पढ़ने और लिखने दोनों के लिए फाइल खोलता है। (फ़ाइल मौजूद होनी चाहिए)
  • w + - फ़ाइल को पढ़ने और लिखने दोनों के लिए एक खाली फ़ाइल के रूप में खोलता है। यदि फ़ाइल मौजूद है, तो इसकी सामग्री नष्ट हो जाती है।
  • ए + - पढ़ने और संलग्न करने के लिए फ़ाइल खोलता है; एप्परिंग ऑपरेशन में फ़ाइल में नया डेटा लिखे जाने से पहले ईओएफ मार्कर को हटाना शामिल है, और ईओएफ मार्कर को पूरा होने के बाद पुनर्स्थापित किया जाता है। यदि यह मौजूद नहीं है तो यह पहली बार फाइल बनाता है। पढ़ने और संलग्न करने के लिए फ़ाइल खोलता है; एप्परिंग ऑपरेशन में फ़ाइल में नया डेटा लिखे जाने से पहले ईओएफ मार्कर को हटाना शामिल है, और ईओएफ मार्कर को पूरा होने के बाद पुनर्स्थापित किया जाता है। यदि यह मौजूद नहीं है तो यह पहली बार फाइल बनाता है।

फ़ाइल मोड संयोजन

यह तालिका पाठ और बाइनरी फ़ाइलों दोनों के लिए फ़ाइल मोड संयोजन दिखाती है। आम तौर पर, आप या तो पाठ फ़ाइल से पढ़ते हैं या लिखते हैं, लेकिन एक ही समय में दोनों नहीं। एक बाइनरी फ़ाइल के साथ, आप एक ही फाइल को पढ़ और लिख सकते हैं। नीचे दी गई तालिका से पता चलता है कि आप प्रत्येक संयोजन के साथ क्या कर सकते हैं।

  • r पाठ - पढ़ा
  • आरबी + बाइनरी - पढ़ें
  • r + text - पढ़ें, लिखें
  • r + b बाइनरी - पढ़ें, लिखें
  • आरबी + बाइनरी - पढ़ें, लिखें
  • w पाठ - लिखना, बनाना, काट देना
  • wb बाइनरी - लिखना, बनाना, कम करना
  • w + पाठ - पढ़ें, लिखें, बनाएं, काटें
  • डब्ल्यू + बी बाइनरी - पढ़ें, लिखें, बनाएं, काटें
  • wb + बाइनरी - पढ़ें, लिखें, बनाएं, काटें
  • एक पाठ - लिखें, बनाएँ
  • अब बाइनरी - लिखना, बनाना
  • एक + पाठ - पढ़ना, लिखना, बनाना
  • a + b बाइनरी - लिखना, बनाना
  • अब + बाइनरी - लिखना, बनाना

जब तक आप केवल एक फ़ाइल ("wb" का उपयोग करते हैं) या केवल एक ("rb" का उपयोग करें) का निर्माण कर रहे हैं, तो आप "w + b" का उपयोग करके दूर हो सकते हैं।

कुछ कार्यान्वयन अन्य पत्रों को भी अनुमति देते हैं। माइक्रोसॉफ्ट, उदाहरण के लिए, अनुमति देता है:

  • t - पाठ विधा
  • सी - कमिट
  • n - गैर-प्रतिबद्ध
  • एस - क्रमिक पहुंच के लिए कैशिंग का अनुकूलन
  • आर - गैर-अनुक्रमिक (यादृच्छिक अभिगम) कैशिंग
  • टी - अस्थायी
  • डी - डिलीट / अस्थायी, जो बंद होने पर फाइल को मारता है।

ये पोर्टेबल नहीं हैं इसलिए इनका उपयोग अपने जोखिम पर करें।

रैंडम एक्सेस फाइल स्टोरेज का उदाहरण

बाइनरी फ़ाइलों का उपयोग करने का मुख्य कारण लचीलापन है जो आपको फ़ाइल में कहीं भी पढ़ने या लिखने की अनुमति देता है। पाठ फ़ाइलें केवल आपको क्रमिक रूप से पढ़ने या लिखने देती हैं। जैसे कि सस्ती या मुफ्त डेटाबेस की व्यापकता के साथ SQLite तथा माई एसक्यूएल, बाइनरी फ़ाइलों पर यादृच्छिक अभिगम का उपयोग करने की आवश्यकता को कम करता है। हालाँकि, फ़ाइल रिकॉर्ड के लिए रैंडम एक्सेस थोड़ा पुराना है लेकिन फिर भी उपयोगी है।

एक उदाहरण की जाँच

उदाहरण मानें कि एक इंडेक्स और डेटा फ़ाइल जोड़ी को एक यादृच्छिक एक्सेस फ़ाइल में तार संचय दिखाता है। तार अलग-अलग लंबाई के होते हैं और स्थिति 0, 1 और इसी तरह से अनुक्रमित होते हैं।

दो शून्य कार्य हैं: CreateFiles () और ShowRecord (int recnum)। CreateFiles एक चार * 4 आकार के बफर का उपयोग करता है, जो कि स्ट्रिंग तार से बना एक अस्थायी स्ट्रिंग है जो n तारक द्वारा n से 5 से 1004 भिन्न होता है। दो FILE * वैरिएबल ftindex और ftdata में wb फिल्ममोड का उपयोग करके बनाए गए हैं। निर्माण के बाद, इनका उपयोग फाइलों में हेरफेर करने के लिए किया जाता है। दो फाइलें हैं

  • index.dat
  • Data.dat

इंडेक्स फ़ाइल में 1000 प्रकार के इंडेक्स टाइप के रिकॉर्ड हैं; यह एक संरचना है, जिसमें दो सदस्य हैं (प्रकार fpos_t) और आकार। लूप का पहला भाग:

इस तरह स्ट्रिंग संदेश पॉप्युलेट करता है।

और इसी तरह। फिर यह:

स्ट्रिंग की लंबाई के साथ संरचना को पॉप्युलेट करता है और डेटा फ़ाइल में बिंदु जहां स्ट्रिंग लिखा जाएगा।

इस बिंदु पर, दोनों सूचकांक फ़ाइल संरचना और डेटा फ़ाइल स्ट्रिंग को उनकी संबंधित फ़ाइलों को लिखा जा सकता है। हालांकि ये बाइनरी फाइलें हैं, इन्हें क्रमिक रूप से लिखा जाता है। सिद्धांत रूप में, आप रिकॉर्ड को फ़ाइल के वर्तमान छोर से परे लिख सकते हैं, लेकिन यह उपयोग करने के लिए एक अच्छी तकनीक नहीं है और शायद सभी पोर्टेबल में नहीं।

अंतिम भाग दोनों फाइलों को बंद करना है। यह सुनिश्चित करता है कि फ़ाइल का अंतिम भाग डिस्क पर लिखा गया है। फ़ाइल लिखने के दौरान, बहुत से लेखन सीधे डिस्क पर नहीं जाते हैं, लेकिन निश्चित आकार के बफ़र्स में आयोजित किए जाते हैं। बफ़र लिखने के बाद बफ़र की पूरी सामग्री को डिस्क पर लिखा जाता है।

एक फ़ाइल फ्लश फ़ंक्शन बलों को फ्लशिंग करता है और आप फ़ाइल फ़्लशिंग रणनीतियों को भी निर्दिष्ट कर सकते हैं, लेकिन वे टेक्स्ट फ़ाइलों के लिए अभिप्रेत हैं।

ShowRecord फ़ंक्शन

यह जांचने के लिए कि डेटा फ़ाइल से किसी भी निर्दिष्ट रिकॉर्ड को पुनर्प्राप्त किया जा सकता है, आपको दो चीजों को जानने की आवश्यकता है: यह डेटा फ़ाइल में कहां से शुरू होती है और कितनी बड़ी है।

यह वही है जो सूचकांक फ़ाइल करता है। ShowRecord फ़ंक्शन दोनों फ़ाइलों को खोलता है, उपयुक्त बिंदु (रिकंम * साइज़ोफ़ (indextype) की तलाश करता है और कई बाइट्स = sizeof (इंडेक्स) प्राप्त करता है।

SEEK_SET एक स्थिरांक है जो निर्दिष्ट करता है कि fseek कहाँ से किया गया है। इसके लिए दो अन्य स्थिरांक परिभाषित हैं।

  • SEEK_CUR - वर्तमान स्थिति के सापेक्ष चाहते हैं
  • SEEK_END - फ़ाइल के अंत से निरपेक्ष की तलाश करें
  • SEEK_SET - फ़ाइल की शुरुआत से पूर्ण की तलाश करें

आकार (इंडेक्स) द्वारा फ़ाइल पॉइंटर को आगे बढ़ाने के लिए आप SEEK_CUR का उपयोग कर सकते हैं।

डेटा का आकार और स्थिति प्राप्त करने के बाद, इसे प्राप्त करना शेष है।

यहां, index.pos के प्रकार के कारण fsetpos () का उपयोग करें जो fpos_t है। एक वैकल्पिक तरीका है कि फगोटॉप के बजाय फेलोज़ का उपयोग करें और फ़ेसपोज़ के बजाय फ़ेसक। जोड़ी fseek और ftell int के साथ काम करते हैं जबकि fgetpos और fsetpos fpos_t का उपयोग करते हैं।

रिकॉर्ड को मेमोरी में पढ़ने के बाद, एक अशक्त वर्ण \ 0 को इसे एक उचित में बदलने के लिए जोड़ा जाता है सी स्ट्रिंग. इसे न भूलें या आपको कोई दुर्घटना हो जाएगी। पहले की तरह, दोनों फाइलों पर fclose कहा जाता है। यद्यपि आप किसी भी डेटा को नहीं खोएंगे यदि आप fclose (राइट्स के साथ) भूल जाते हैं, तो आपके पास मेमोरी लीक होगी।