सी प्रोग्रामिंग के दायरे में, इनपुट, आउटपुट और मेमोरी को प्रभावी ढंग से प्रबंधित करना मौलिक है। इन महत्वपूर्ण अवधारणाओं को समझने में आपकी मदद करने के लिए, get_next_line एक प्रोजेक्ट है जहां आप एक फ़ंक्शन लिखेंगे जो फ़ाइल डिस्क्रिप्टर का उपयोग करके फ़ाइल लाइन को लाइन द्वारा पढ़ता है। फ़ंक्शन का प्रत्येक आह्वान फ़ाइल से अगली पंक्ति को पढ़ता है, जिससे आप एक समय में संपूर्ण फ़ाइल सामग्री को एक पंक्ति में संसाधित कर सकते हैं।
एक फ़ाइल डिस्क्रिप्टर एक गैर-नकारात्मक पूर्णांक है जो सिस्टम में एक खुली फ़ाइल की विशिष्ट रूप से पहचान करता है। जब कोई प्रोग्राम किसी फ़ाइल को खोलता है, तो ऑपरेटिंग सिस्टम एक फ़ाइल डिस्क्रिप्टर लौटाता है जिसका उपयोग बाद के ऑपरेशनों में उस फ़ाइल को संदर्भित करने के लिए किया जा सकता है, जैसे फ़ाइल को पढ़ना, लिखना या बंद करना। फ़ाइल डिस्क्रिप्टर एक अमूर्तता है जिसका उपयोग ऑपरेटिंग सिस्टम द्वारा फ़ाइलों, सॉकेट और पाइप सहित विभिन्न I/O संसाधनों को प्रबंधित करने के लिए किया जाता है।
प्रक्रिया ए में 0, 1, और 2 (मानक इनपुट, मानक आउटपुट और मानक त्रुटि) प्रक्रिया बी में फ़ाइल डिस्क्रिप्टर से स्वतंत्र और अलग हैं। यह अलगाव सुनिश्चित करता है कि एक प्रक्रिया में फ़ाइल संचालन उन लोगों के साथ हस्तक्षेप नहीं करता है एक और।
प्रत्येक फ़ाइल डिस्क्रिप्टर एक फ़ाइल डिस्क्रिप्टर तालिका प्रविष्टि से जुड़ा होता है जिसमें फ़ाइल के बारे में आवश्यक जानकारी होती है। इसमें फ़ाइल पथ, एक्सेस अनुमतियां और वर्तमान ऑफसेट शामिल है, जो पढ़ने/लिखने के संचालन के लिए फ़ाइल के भीतर स्थिति को ट्रैक करता है। यह संरचना ऑपरेटिंग सिस्टम को कई खुली फ़ाइलों को कुशलतापूर्वक प्रबंधित करने और सही पहुंच और डेटा हेरफेर सुनिश्चित करने की अनुमति देती है।
ध्यान दें कि फ़ाइल डिस्क्रिप्टर 0, 1, और 2 मानक स्ट्रीम के लिए ऑपरेटिंग सिस्टम द्वारा आरक्षित हैं। फ़ाइल डिस्क्रिप्टर 0 का उपयोग मानक इनपुट (stdin) के लिए किया जाता है, जो आमतौर पर कीबोर्ड से इनपुट का प्रतिनिधित्व करता है। फ़ाइल डिस्क्रिप्टर 1 का उपयोग मानक आउटपुट (स्टडआउट) के लिए किया जाता है, जो स्क्रीन या टर्मिनल पर आउटपुट का प्रतिनिधित्व करता है। फ़ाइल डिस्क्रिप्टर 2 का उपयोग मानक त्रुटि (stderr) के लिए किया जाता है, जो स्क्रीन या टर्मिनल पर आउटपुट का भी प्रतिनिधित्व करता है लेकिन विशेष रूप से त्रुटि संदेशों के लिए अभिप्रेत है। ये आरक्षित फ़ाइल डिस्क्रिप्टर सुनिश्चित करते हैं कि बुनियादी इनपुट और आउटपुट संचालन को विभिन्न कार्यक्रमों और वातावरणों में लगातार प्रबंधित किया जा सकता है। ओपन फ़ंक्शन द्वारा लौटाया गया कोई भी फ़ाइल डिस्क्रिप्टर 3 या अधिक होगा, यह सुनिश्चित करते हुए कि यह इन मानक धाराओं के साथ विरोध नहीं करता है।
'#include
'
'#include' int fd = open("example.txt", O_RDONLY);
if (fd == -1) {
perror("Error opening file");
return 1;
}
एक पूर्णांक के रूप में दर्शाया गया एक फ़ाइल डिस्क्रिप्टर, ओपन फ़ंक्शन का उपयोग करके प्राप्त किया जाता है, जो दो पैरामीटर लेता है: फ़ाइल नाम (या पथ) और फ़्लैग जो फ़ाइल की एक्सेस अनुमतियां निर्धारित करते हैं। उदाहरण के लिए, किसी फ़ाइल की सामग्री को पढ़ने के लिए, हम O_RDONLY ध्वज (केवल पढ़ने के लिए) का उपयोग करते हैं। पढ़ने और लिखने के लिए हम O_RDWR ध्वज का उपयोग करते हैं। हालाँकि कई झंडे उपलब्ध हैं, हम इस परियोजना के लिए केवल O_RDONLY का उपयोग करेंगे। ओपन फ़ंक्शन एक गैर-नकारात्मक पूर्णांक लौटाता है, जो ऑपरेशन सफल होने पर फ़ाइल डिस्क्रिप्टर है; अन्यथा, यह त्रुटि दर्शाने के लिए -1 लौटाता है (आपके पास example.txt तक पहुंचने की अनुमति नहीं है)। ध्यान दें कि ओपन फ़ंक्शन unistd.h लाइब्रेरी में है, और अनुमति फ़्लैग fcntl.h में परिभाषित हैं।
'#include
'
'#include'
'#include'
'#define BUFFER_SIZE 4'int fd = open("example.txt", O_RDONLY);
if (fd == -1) {
perror("Error opening file");
return 1;
}
char buffer[BUFFER_SIZE];
read(fd, buffer, sizeof(buffer)-1);
printf("1st call : %s\n", buffer);
// prints the first 3 bytes
read(fd, buffer, sizeof(buffer)-1);
printf("2nd call : %s\n", buffer);
read(fd, buffer, sizeof(buffer)-1);
printf("3rd call : %s\n", buffer);
read(fd, buffer, sizeof(buffer)-1);
printf("4th call : %s\n", buffer);
read(fd, buffer, sizeof(buffer)-1);
printf("5th call : %s\n", buffer);
कोड परिणाम
पहली कॉल: HEL
दूसरी कॉल: LO
तीसरी कॉल: WOR
चौथी कॉल: एलडी
5वीं कॉल: (शून्य)
unistd.h लाइब्रेरी द्वारा प्रदान किया गया रीड फ़ंक्शन, फ़ाइल डिस्क्रिप्टर से डेटा पढ़ने के लिए उपयोग किया जाता है। इसमें तीन पैरामीटर होते हैं: फ़ाइल डिस्क्रिप्टर, पढ़े गए डेटा को संग्रहीत करने के लिए एक बफर, और फ़ाइल से पढ़ने के लिए बाइट्स की संख्या, रीड फ़ंक्शन फ़ाइल से पढ़े गए बाइट्स की संख्या लौटाता है।
फ़ाइल डिस्क्रिप्टर तालिका में, ऑफ़सेट नामक एक विशेषता होती है। ऑफसेट फ़ाइल के भीतर वर्तमान स्थिति का ट्रैक रखता है। हर बार जब रीड फ़ंक्शन को कॉल किया जाता है, तो यह वर्तमान ऑफसेट से शुरू होने वाले डेटा को पढ़ता है और फिर पढ़े गए बाइट्स की संख्या के आधार पर ऑफसेट को आगे बढ़ाता है। यह सुनिश्चित करता है कि बाद का पाठ वहीं से जारी रहे जहां अंतिम पढ़ा गया था।
हमारे उदाहरण में:
पढ़ने के लिए दूसरी कॉल अद्यतन ऑफसेट (3) से शुरू होकर अगले 3 बाइट्स को पढ़ती है, फिर ऑफसेट को 6 पर अपडेट करती है।
वगैरह ...
बफ़र पढ़ने के लिए 5वीं कॉल शून्य होगी और फ़ाइल के अंत का संकेत देने वाला 0 रिटर्न पढ़ेगा।
यह प्रक्रिया तब तक जारी रहती है जब तक फ़ाइल से सारा डेटा पढ़ नहीं लिया जाता या कोई त्रुटि नहीं आ जाती। यह सुनिश्चित करने के लिए कि इसे एक स्ट्रिंग के रूप में मुद्रित किया जा सकता है, प्रत्येक पढ़ने के बाद बफ़र को शून्य-समाप्त कर दिया जाता है।
char *get_next_line(int fd) एक फ़ाइल के फ़ाइल डिस्क्रिप्टर को पैरामीटर के रूप में लेता है और प्रत्येक कॉल के लिए एक लाइन लौटाता है। यदि यह फ़ाइल के अंत तक पहुँच जाता है, तो यह NULL लौटाता है।
https://github.com/Its-JoeTheKing/get_next_line
अस्वीकरण: उपलब्ध कराए गए सभी संसाधन आंशिक रूप से इंटरनेट से हैं। यदि आपके कॉपीराइट या अन्य अधिकारों और हितों का कोई उल्लंघन होता है, तो कृपया विस्तृत कारण बताएं और कॉपीराइट या अधिकारों और हितों का प्रमाण प्रदान करें और फिर इसे ईमेल पर भेजें: [email protected] हम इसे आपके लिए यथाशीघ्र संभालेंगे।
Copyright© 2022 湘ICP备2022001581号-3