[Powered by Google Translate] [फ़ाइल मैं / हे] [जेसन Hirschhorn, हार्वर्ड विश्वविद्यालय] [यह CS50 है, CS50.TV] जब हम एक फ़ाइल के बारे में सोचना, जो मन में आता है, एक माइक्रोसॉफ्ट वर्ड दस्तावेज है, एक JPEG छवि, या एक एमपी 3 गीत, और हम अलग अलग तरीकों में फ़ाइलों के इन प्रकार के प्रत्येक के साथ बातचीत. उदाहरण के लिए, हम एक Word दस्तावेज़ में पाठ जोड़ने के लिए जबकि एक JPEG छवि के साथ हम बाहर किनारों फसल सकता है या रंग सुधारना. हुड के तहत हमारे कंप्यूटर में फाइल के सभी अधिक कुछ नहीं कर रहे हैं शून्य और लोगों की एक लंबी अनुक्रम से. यह विशिष्ट अनुप्रयोग है कि फाइल के साथ सूचना का आदान प्रदान करने के लिए है फैसला कैसे इस लंबी अनुक्रम पर कार्रवाई करने के लिए है और यह उपयोगकर्ता के लिए प्रस्तुत है. एक तरफ, एक दस्तावेज़ सिर्फ एक बाइट में लग सकता है, या 8 शून्य और लोगों, और स्क्रीन पर एक ASCII वर्ण प्रदर्शित करते हैं. दूसरी ओर, एक बिटमैप छवि 3 बाइट्स पर लग सकता है, या 24 शून्य और लोगों, और उन्हें 3 षोडश संख्या के रूप में व्याख्या लाल, हरे और नीले रंग के लिए मूल्यों का प्रतिनिधित्व एक छवि के एक पिक्सेल में. वे जो कुछ भी तरह अपनी स्क्रीन पर उनके मूल में, लग सकता है, फ़ाइलों का कुछ भी नहीं कर रहे हैं शून्य और लोगों के एक दृश्य की तुलना में अधिक है. तो चलो में गोता करने के लिए और कैसे हम वास्तव में इन शून्य और लोगों में हेरफेर पर देखो जब यह करने के लिए लिखने और एक फ़ाइल से पढ़ने के लिए आता है. मैं यह एक साधारण प्रक्रिया तीन भाग में टूट द्वारा शुरू करेंगे. अगले, मैं दो कोड उदाहरण है कि इन तीन भागों का प्रदर्शन में डुबकी हूँ. अंत में, मैं इस प्रक्रिया की समीक्षा के लिए और अपने सबसे महत्वपूर्ण विवरण के कुछ. किसी भी फ़ाइल है कि अपने डेस्कटॉप पर बैठता है के साथ के रूप में, पहली बात करने के लिए खुला है. सी में हम एक पूर्वनिर्धारित struct एक सूचक की घोषणा करके इस करते हैं कि डिस्क पर एक फ़ाइल का प्रतिनिधित्व करता है. इस समारोह कॉल में, हम यह भी तय करना होगा कि हम या फ़ाइल से पढ़ने लिखने के लिए करना चाहते हैं. अगला, हम वास्तविक पढ़ने और लिखने करते हैं. विशेष कार्यों के एक नंबर हम इस हिस्से में उपयोग कर सकते हैं, और उनमें से लगभग सभी पत्र एफ, जो फ़ाइल के लिए खड़ा के साथ शुरू करते हैं. अंतिम, फ़ाइलों के शीर्ष कोने में छोटे लाल एक्स के लिए जैसा आपके कंप्यूटर पर खोलते हैं, हम एक अंतिम समारोह कॉल के साथ फ़ाइल बंद करें. अब है कि हम हम क्या करने जा रहे हैं की एक सामान्य विचार है, कोड में डुबकी चलो. इस निर्देशिका में, हम दो सी फ़ाइलें और उनके इसी निष्पादन योग्य फ़ाइलों है. टाइपराइटर कार्यक्रम एक कमांड लाइन तर्क लेता है, दस्तावेज़ का नाम हम बनाना चाहते हैं. इस मामले में, हम यह doc.txt फोन करता हूँ. चलो कार्यक्रम चलाने के लिए और लाइनों की एक जोड़ी दर्ज करें. हाय. मेरा नाम जेसन है. अंत में, हम "टाइप कर छोड़ दिया." अगर हम अब इस निर्देशिका में फ़ाइलों के सभी सूची, हम देखते हैं कि एक नया दस्तावेज़ doc.txt बुलाया से विद्यमान है. उस फ़ाइल को इस कार्यक्रम अभी बनाया है. और जाहिर है, यह भी शून्य और लोगों की एक लंबी अनुक्रम से अधिक कुछ नहीं है. अगर हम इस नए फ़ाइल खोलने के लिए, हम कोड की 3 लाइनों हम अपने कार्यक्रम में प्रवेश किया देखते हैं - हाय. मई नाम जेसन है. लेकिन क्या वास्तव में जब typewriter.c पर चलता रहा है? हमारे लिए ब्याज की पहली पंक्ति 24 लाइन है. इस लाइन में, हम हमारे फ़ाइल सूचक की घोषणा. समारोह कि इस सूचक, fopen देता है, दो तर्क लेता है. 1 फ़ाइल फ़ाइल अगर उपयुक्त विस्तार सहित नाम है. याद है कि एक फ़ाइल एक्सटेंशन के अपने न्यूनतम स्तर पर फाइल को प्रभावित नहीं करता है. हम हमेशा शून्य और लोगों की एक लंबी अनुक्रम के साथ काम कर रहे हैं. लेकिन यह प्रभाव करता है कैसे फ़ाइलों की व्याख्या और क्या आवेदन करने के लिए उन्हें खोलने के लिए उपयोग किया जाता है. fopen के लिए दूसरा तर्क एक पत्र है कि हम क्या करने के बाद हम फ़ाइल खोलने की योजना के लिए खड़ा है. इस तर्क के लिए तीन विकल्प हैं डब्ल्यू, आर, और ए - हम इस मामले में w चुना है क्योंकि हम फाइल करने के लिए लिखने के लिए चाहते हैं. आर, जैसा कि आप शायद अनुमान कर सकते हैं, फ़ाइल को पढ़ने के लिए है. और एक फाइल करने के लिए appending के लिए है. जबकि दोनों w और एक फाइल करने के लिए लिखने के लिए इस्तेमाल किया जा सकता है, w फ़ाइल की शुरुआत से लेखन शुरू कर देंगे और किसी भी संभावित डेटा है कि पहले से संग्रहीत किया गया है अधिलेखित. डिफ़ॉल्ट रूप से, फ़ाइल हम खोलने के लिए, अगर यह पहले से ही मौजूद नहीं है, हमारे वर्तमान कार्य निर्देशिका में बनाया है. हालांकि, अगर हम करने के लिए उपयोग करने के लिए या एक अलग स्थान में एक फ़ाइल बनाने चाहते हैं, fopen के पहले तर्क में, हम फ़ाइल नाम के अलावा कोई फ़ाइल पथ निर्दिष्ट कर सकते हैं. हालांकि इस प्रक्रिया के पहले भाग केवल लंबे समय से कोड की एक पंक्ति है, यह हमेशा अच्छा अभ्यास है लाइनों का एक और सेट शामिल कि जांच करने के लिए सुनिश्चित करें कि फ़ाइल सफलतापूर्वक खोला गया था या बनाया. यदि fopen अशक्त देता है, हम हमारे कार्यक्रम के साथ आगे बना नहीं चाहते हैं, और अगर इस ऑपरेटिंग सिस्टम स्मृति से बाहर हो सकता है या अगर हम जिसके लिए हम उचित अनुमति नहीं है था एक निर्देशिका में एक फ़ाइल खोलने की कोशिश करो. इस प्रक्रिया के भाग दो टाइपराइटर जबकि पाश में जगह लेता है. हम एक CS50 पुस्तकालय समारोह का उपयोग करने के लिए उपयोगकर्ता से इनपुट मिल, यह सोचते हैं और वे इस कार्यक्रम छोड़ने के लिए नहीं करना चाहती, हम समारोह fputs का उपयोग करने के लिए स्ट्रिंग ले और यह फाइल करने के लिए लिखने. fputs केवल कई कार्यों के एक हम फ़ाइल में लिखने के लिए इस्तेमाल कर सकते हैं. दूसरों fwrite, fputc, और भी fprintf शामिल हैं. विशेष समारोह के बावजूद हम का उपयोग कर हालांकि अंत, उनमें से सभी को पता है कि अपने तर्क के माध्यम से की जरूरत है, कम से कम दो बातें - क्या लिखा है और जहां यह करने के लिए लिखा जाना चाहिए की जरूरत है. हमारे मामले में, इनपुट स्ट्रिंग है कि लिखा जाना चाहिए और fp सूचक है कि हमें जहाँ हम लिख रहे हैं निर्देश है. इस कार्यक्रम में इस प्रक्रिया के दो भाग बल्कि सीधी है. हम बस उपयोगकर्ता से एक स्ट्रिंग ले रहे हैं और यह सीधे जोड़ने के साथ हमारे फाइल करने के लिए बहुत कम करने के लिए कोई इनपुट सत्यापन या सुरक्षा जांच. अक्सर बहरहाल, दो भाग अपने कोड के थोक ले जाएगा. अंत में, तीन भाग 58 लाइन पर है, जहां हम फ़ाइल बंद. यहाँ हम fclose और इसे पारित करने के लिए हमारी मूल फ़ाइल सूचक कहते हैं. बाद में लाइन में, हम शून्य लौटने के लिए, हमारे कार्यक्रम के अंत का संकेत है. और, हाँ, तीन भाग है कि जितना सरल है. फाइलों से पढ़ने के लिए आगे बढ़ना है. हमारी निर्देशिका में वापस हम एक printer.c नामक एक फाइल है. चलो यह हम अभी बनाया फ़ाइल के साथ चलाने के - doc.txt. इस कार्यक्रम, जैसा कि नाम से पता चलता है, बस से बाहर फ़ाइल की सामग्री मुद्रित करने के लिए यह करने के लिए पारित कर दिया जाएगा. और वहाँ हम यह है. कोड की लाइनों हम पहले टाइप था और doc.txt में बचाया. हाय. मेरा नाम जेसन है. यदि हम printer.c में गोता, हम देखते हैं कि कोड का एक बहुत कुछ करने के लिए इसी तरह लग रहा है क्या हम सिर्फ typewriter.c के माध्यम से चला गया. दरअसल 22 लाइन, जहाँ हम फ़ाइल खोला, और 39 लाइन, जहाँ हम फाइल बंद, दोनों हैं लगभग typewriter.c करने के लिए समान है, fopen दूसरा तर्क के लिए बचाने के लिए. इस समय हम एक फ़ाइल से पढ़ रहे हैं, इसलिए हम r चुना है w के बजाय. इस प्रकार, इस प्रक्रिया के दूसरे भाग पर ध्यान केंद्रित है. 35 लाइन में, हमारे 4 पाश में दूसरी शर्त के रूप में, हम fgets के लिए एक फोन कर, साथी पहले से fputs समारोह. इस समय हम तीन तर्क है. पहले जहां स्ट्रिंग संग्रहीत किया जाएगा वर्णों की सरणी सूचक है. 2 वर्णों की अधिकतम संख्या को पढ़ा जा है. और 3 फ़ाइल जिसके साथ हम काम कर रहे हैं सूचक है. आप देखेंगे कि पाश के लिए समाप्त हो जाती है जब fgets अशक्त रिटर्न. वहाँ दो कारण है कि यह हुआ हो सकता है. सबसे पहले, एक त्रुटि हुई हो सकती है. दूसरा, और अधिक संभावना है, फ़ाइल के अंत तक पहुँच गया था और कोई और अधिक वर्ण पढ़ रहे थे. मामले में आप सोच रहे हैं, दो कार्यों मौजूद नहीं है कि हमें बताने के लिए अनुमति कारण है जो इस विशेष रिक्त सूचक के लिए कारण है. और, आश्चर्य की बात नहीं है, क्योंकि वे फाइलों के साथ काम करने के साथ क्या करना है, दोनों ferror समारोह और पत्र च के साथ feof समारोह शुरू करते हैं. अंत में, इससे पहले कि हम निष्कर्ष है, एक फ़ाइल समारोह के अंत के बारे में जल्दी ध्यान दें, जो बस के रूप में उल्लेख किया है, feof के रूप में लिखा है. अक्सर आप अपने आप को मिल जबकि और loops के लिए उपयोग करने के लिए उत्तरोत्तर फ़ाइलों के माध्यम से अपनी तरह पढ़ा हूँ. इस प्रकार, आप इन loops को समाप्त करने के लिए एक तरह से करने के बाद आप इन फ़ाइलों के अंत तक पहुँच जायेंगे. अपनी फ़ाइल सूचक पर feof कॉलिंग और देखने के लिए अगर यह सच है की जाँच कि बस करना होगा. इस प्रकार, हालत (feof (एफ पी)) के साथ एक जबकि पाश एक पूरी तरह से उचित समाधान की तरह लग सकता है. हालांकि, कहते हैं, हम हमारे पाठ फ़ाइल में एक लाइन छोड़ दिया है. हम हमारे जबकि पाश में प्रवेश कर सकते हैं और सब कुछ बाहर काम के रूप में की योजना बनाई. अगले के माध्यम से दौर में, हमारे कार्यक्रम देखने के लिए अगर fp की feof सच है की जाँच करेगा, लेकिन और यहाँ समझने के लिए इस महत्वपूर्ण बिंदु है - बस अभी तक यह सच नहीं होगा. ऐसा इसलिए है क्योंकि उद्देश्य feof की जाँच करने के लिए नहीं है अगर अगले एक पढ़ा समारोह कॉल फ़ाइल के अंत मारा जाएगा, बल्कि जांच करने के लिए किया जाए या नहीं फ़ाइल का अंत पहले से ही पूरी हो चुकी है. इस उदाहरण के मामले में, हमारे फ़ाइल की अंतिम पंक्ति को पढ़ने के लिए पूरी तरह से सुचारू रूप से चला जाता है, लेकिन कार्यक्रम अभी तक कि हम हमारे फाइल के अंत मारा है पता नहीं है. यह नहीं है जब तक यह एक अतिरिक्त पढ़ा नहीं है कि यह फाइल के अंत काउंटर. इस प्रकार, एक सही हालत पालन होगा: fgets और अपने तीन तर्क - उत्पादन, उत्पादन के आकार, और एफपी - और बराबर नहीं है कि सभी को अशक्त करने के लिए. इस दृष्टिकोण हम printer.c में ले लिया है, और इस मामले में, पाश बाहर निकलता है के बाद, आप feof या ferror इस लूप से बाहर निकलने के लिए विशिष्ट तर्क के रूप में उपयोगकर्ता को सूचित करने के लिए कह सकते हैं. लेखन और एक फ़ाइल से पढ़ने के अपने सबसे बुनियादी है, एक साधारण प्रक्रिया 3-हिस्सा. सबसे पहले, हम फ़ाइल खोलें. दूसरा, हम हमारे फाइल में कुछ बातों को डाल दिया है या इसे से बाहर कुछ चीजें लेने के. तीसरा, हम फ़ाइल बंद करें. पहली और आखिरी भागों आसान कर रहे हैं. मध्य भाग है, जहां मुश्किल सामान है. और हालांकि हुड के नीचे हम हमेशा शून्य और लोगों की एक लंबी अनुक्रम के साथ काम कर रहे हैं, यह तब होता है जब अमूर्त की एक परत को जोड़ने के लिए कोडिंग में मदद करता है कि कुछ है कि और अधिक निकटता जैसा दिखता है क्या हम देखने के लिए इस्तेमाल कर रहे हैं में अनुक्रम बदल जाता है. उदाहरण के लिए, अगर हम एक बिटमैप 24 बिट फ़ाइल के साथ काम कर रहे हैं, हम संभावना या पढ़ने हो जाएगा एक समय में तीन बाइट्स लेखन. जो मामले में, यह समझ बनाने को परिभाषित करने और उचित नाम होगा एक struct कि 3 बाइट्स बड़ी है. हालांकि फाइलों के साथ काम जटिल लग सकता है, उन्हें उपयोग हमें वास्तव में उल्लेखनीय कुछ करने के लिए अनुमति देता है. हम हमारे कार्यक्रम के बाहर दुनिया की स्थिति को बदल सकते हैं, हम कुछ है कि हमारे कार्यक्रम के जीवन से परे रहता है बना सकते हैं, या हम कुछ भी बदल सकते हैं कि पहले हमारे कार्यक्रम चलाने शुरू कर दिया बनाया गया था. फाइलों के साथ बातचीत सी. में एक प्रोग्रामिंग के सही मायने में शक्तिशाली हिस्सा है और मैं देखने के लिए आप क्या करने के लिए आने के लिए कोड में इसके साथ बनाने जा रहे हैं के लिए उत्साहित हूँ. मेरा नाम जेसन Hirschhorn है. यह CS50 है. [CS50.TV] [हँसी] ठीक है. एक लो. यहाँ हम चले. जब हम एक फ़ाइल के बारे में सोच - ओह >> रुको. माफ़ कीजिए. [हँसी] ठीक है. वहाँ हे. जब हम एक फ़ाइल के बारे में सोच - जब आप एक फ़ाइल के बारे में सोच - ठीक है. मुझे बताओ कि जब आप तैयार हैं. ओह, बढ़िया. हालांकि एक teleprompter से पढ़ने लग सकता है - नहीं. मेरा बुरा.