"यदि कोई कर्मचारी अपना काम अच्छी तरह से करना चाहता है, तो उसे पहले अपने औजारों को तेज करना होगा।" - कन्फ्यूशियस, "द एनालेक्ट्स ऑफ कन्फ्यूशियस। लू लिंगगोंग"
मुखपृष्ठ > प्रोग्रामिंग > फ़ाइल डिस्क्रिप्टर और सिस्टम के I/O से निपटने का तरीका जानने के लिए अगली पंक्ति एक प्रोजेक्ट प्राप्त करें

फ़ाइल डिस्क्रिप्टर और सिस्टम के I/O से निपटने का तरीका जानने के लिए अगली पंक्ति एक प्रोजेक्ट प्राप्त करें

2024-11-07 को प्रकाशित
ब्राउज़ करें:836

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

सिस्टम में फ़ाइल डिस्क्रिप्टर और I/O को समझना

फ़ाइल डिस्क्रिप्टर क्या है?

एक फ़ाइल डिस्क्रिप्टर एक गैर-नकारात्मक पूर्णांक है जो सिस्टम में एक खुली फ़ाइल की विशिष्ट रूप से पहचान करता है। जब कोई प्रोग्राम किसी फ़ाइल को खोलता है, तो ऑपरेटिंग सिस्टम एक फ़ाइल डिस्क्रिप्टर लौटाता है जिसका उपयोग बाद के ऑपरेशनों में उस फ़ाइल को संदर्भित करने के लिए किया जा सकता है, जैसे फ़ाइल को पढ़ना, लिखना या बंद करना। फ़ाइल डिस्क्रिप्टर एक अमूर्तता है जिसका उपयोग ऑपरेटिंग सिस्टम द्वारा फ़ाइलों, सॉकेट और पाइप सहित विभिन्न I/O संसाधनों को प्रबंधित करने के लिए किया जाता है।

प्रक्रिया ए में 0, 1, और 2 (मानक इनपुट, मानक आउटपुट और मानक त्रुटि) प्रक्रिया बी में फ़ाइल डिस्क्रिप्टर से स्वतंत्र और अलग हैं। यह अलगाव सुनिश्चित करता है कि एक प्रक्रिया में फ़ाइल संचालन उन लोगों के साथ हस्तक्षेप नहीं करता है एक और।

फ़ाइल डिस्क्रिप्टर तालिका

GET NEXT LINE A Project TO Learn How To Deal with File Descriptors and I/O of System

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

ध्यान दें कि फ़ाइल डिस्क्रिप्टर 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 लाइब्रेरी द्वारा प्रदान किया गया रीड फ़ंक्शन, फ़ाइल डिस्क्रिप्टर से डेटा पढ़ने के लिए उपयोग किया जाता है। इसमें तीन पैरामीटर होते हैं: फ़ाइल डिस्क्रिप्टर, पढ़े गए डेटा को संग्रहीत करने के लिए एक बफर, और फ़ाइल से पढ़ने के लिए बाइट्स की संख्या, रीड फ़ंक्शन फ़ाइल से पढ़े गए बाइट्स की संख्या लौटाता है।

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

GET NEXT LINE A Project TO Learn How To Deal with File Descriptors and I/O of System

हमारे उदाहरण में:

  • पढ़ने के लिए पहली कॉल फ़ाइल से पहले 3 बाइट्स को पढ़ती है और उन्हें फ़ाइल की शुरुआत से शुरू करके बफर में संग्रहीत करती है (ऑफ़सेट 0)। फिर ऑफसेट को 3 पर अपडेट किया जाता है।
  • पढ़ने के लिए दूसरी कॉल अद्यतन ऑफसेट (3) से शुरू होकर अगले 3 बाइट्स को पढ़ती है, फिर ऑफसेट को 6 पर अपडेट करती है।
    वगैरह ...

  • बफ़र पढ़ने के लिए 5वीं कॉल शून्य होगी और फ़ाइल के अंत का संकेत देने वाला 0 रिटर्न पढ़ेगा।

यह प्रक्रिया तब तक जारी रहती है जब तक फ़ाइल से सारा डेटा पढ़ नहीं लिया जाता या कोई त्रुटि नहीं आ जाती। यह सुनिश्चित करने के लिए कि इसे एक स्ट्रिंग के रूप में मुद्रित किया जा सकता है, प्रत्येक पढ़ने के बाद बफ़र को शून्य-समाप्त कर दिया जाता है।

समस्या

char *get_next_line(int fd) एक फ़ाइल के फ़ाइल डिस्क्रिप्टर को पैरामीटर के रूप में लेता है और प्रत्येक कॉल के लिए एक लाइन लौटाता है। यदि यह फ़ाइल के अंत तक पहुँच जाता है, तो यह NULL लौटाता है।

पैरामीटर

  • fd: पढ़ने के लिए फ़ाइल का फ़ाइल डिस्क्रिप्टर।
  • BUFFER_SIZE: फ़ाइल से टुकड़ों को पढ़ने के लिए उपयोग किए जाने वाले बफ़र का आकार। आपके प्रोग्राम में कोई लीक नहीं होना चाहिए।

समाधान :

https://github.com/Its-JoeTheKing/get_next_line

विज्ञप्ति वक्तव्य यह आलेख यहां पुन: प्रस्तुत किया गया है: https://dev.to/aerrfig/get-next-line-a-42-project-to-learn-how-to-deal-with-file-descriptors-and-io-of- सिस्टम- 3652 यदि कोई उल्लंघन है, तो कृपया उसे हटाने के लिए [email protected] से संपर्क करें
नवीनतम ट्यूटोरियल अधिक>

चीनी भाषा का अध्ययन करें

अस्वीकरण: उपलब्ध कराए गए सभी संसाधन आंशिक रूप से इंटरनेट से हैं। यदि आपके कॉपीराइट या अन्य अधिकारों और हितों का कोई उल्लंघन होता है, तो कृपया विस्तृत कारण बताएं और कॉपीराइट या अधिकारों और हितों का प्रमाण प्रदान करें और फिर इसे ईमेल पर भेजें: [email protected] हम इसे आपके लिए यथाशीघ्र संभालेंगे।

Copyright© 2022 湘ICP备2022001581号-3