[Powered by Google Translate] [धारा 5: कम आरामदायक]
[नैट Hardison, हार्वर्ड विश्वविद्यालय]
[यह CS50 है.] [CS50.TV]
तो वापस स्वागत करते हैं, लोग.
धारा 5 के लिए आपका स्वागत है.
इस बिंदु पर, प्रश्नोत्तरी 0 पूरा होने और देखा कि कैसे तुमने किया है,
उम्मीद है कि तुम सच में अच्छा लगता है, क्योंकि मैं इस खंड में स्कोर द्वारा बहुत प्रभावित हुआ था.
हमारे ऑनलाइन दर्शकों के लिए, हम सवालों के एक जोड़े को मिला है
समस्या के सेट पर पिछले दो समस्याओं के बारे में या प्रश्नोत्तरी पर, बल्कि.
तो हम वास्तव में उन पर जल्दी जाने के लिए इतना है कि हर कोई देखता है क्या हुआ जा रहे हैं
और कैसे सिर्फ समाधान ही देखने के बजाय वास्तविक समाधान के माध्यम से जाने के लिए.
हम समस्याओं का पिछले कुछ पर बहुत जल्दी जा रहे हैं, 32 और 33.
बस फिर, तो ऑनलाइन दर्शकों को लगता है कि यह देख सकते हैं.
>> यदि आप अपने 32 समस्या है, जो 13 पृष्ठ पर है बारी
16 में से 13, 32 समस्या स्वैप सब के बारे में है.
यह दो integers गमागमन के बारे में सब कुछ था.
यह समस्या है कि हम व्याख्यान में कई बार के एक जोड़े पर चला गया था.
और यहाँ में, हम आपको करने के लिए पूछ रहे थे कि क्या एक त्वरित स्मृति ट्रेस है.
चर के मूल्यों में भरने के रूप में वे ढेर पर हैं
कोड के रूप में इस स्वैप समारोह के माध्यम से चला जाता है.
विशेष रूप से, हम पर क्या देख रहे हैं - कर रहा हूँ इस iPad डाल नीचे जा रहा है -
विशेष रूप से, हम देख रहे हैं क्या है इस लाइन 6 सही यहाँ गिने.
और यह सिर्फ पिछले एक समस्या के साथ समीपता के लिए 6 गिने है.
हम क्या करना चाहते हैं प्रदर्शित करने के लिए या स्मृति लेबल
के रूप में यह समय है जब हम इस लाइन संख्या 6 निष्पादित,
जो प्रभावी रूप से हमारे स्वैप समारोह से एक सही यहाँ वापसी है.
अगर हम यहाँ नीचे स्क्रॉल, हमने देखा है कि स्मृति में सब कुछ के पते हमारे लिए उपलब्ध कराया गया था.
यह बहुत ही महत्वपूर्ण है, हम वापस बस एक पल में यह करने के लिए आया हूँ.
और फिर यहाँ नीचे तल पर, हम एक छोटे स्मृति आरेख था कि हम उल्लेख करने के लिए जा रहे हैं.
मैं वास्तव में इस किया है मेरी iPad पर बाहर.
तो मैं और संदर्भ के लिए इस कोड iPad के बीच आगे और पीछे वैकल्पिक करने के लिए जा रहा हूँ.
>> शुरु करते हैं. पहले, चलो यहाँ की मुख्य लाइनों की पहली जोड़ी पर सही से ध्यान केंद्रित.
शुरू करने के लिए, हम 1 और y 2 एक्स इनिशियलाइज़ करने के लिए जा रहे हैं.
तो हम दो पूर्णांक चर है, वे दोनों के ढेर पर रखा जा जा रहे हैं.
हम उन्हें में 1 और 2 एक डाल करने के लिए जा रहे हैं.
तो अगर मैं अपने iPad पर फ्लिप, उम्मीद है कि, चलो देखते हैं -
एप्पल टीवी mirroring, और हम वहाँ जाओ. ठीक है.
तो अगर मैं अपने iPad पर फ्लिप,
मैं 1 और y 2 एक्स इनिशियलाइज़ चाहते हैं.
हम जानते हैं कि एक्स के रूप में चिह्नित बॉक्स में 1 एक लेखन के द्वारा काफी बस
और एक बॉक्स में 2 y के रूप में चिह्नित है. काफी सरल है.
तो अब चलो लैपटॉप के लिए वापस जाने के लिए देखते हैं, आगे क्या होता है.
तो यह अगली पंक्ति है जहाँ चीजें मुश्किल हो.
हम पैरामीटर्स के रूप में एक्स के पते और y के पते पास एक और स्वैप समारोह के लिए बी.
एक्स और y के पते का पता चीजें हैं जो हम गणना नहीं कर सकते हैं
इन बुलेट के लिए बात कर के बिना सही नीचे अंक यहाँ.
और सौभाग्य से, पहले दो गोली अंक हमें बताओ कि क्या वास्तव जवाब हैं.
स्मृति में x का पता 10, और स्मृति में 14 y के पते है.
तो उन मूल्यों है कि के रूप में पारित हो जाता है एक और ख हमारे स्वैप समारोह में शीर्ष.
तो फिर, हमारे आरेख के लिए वापस स्विचन, मैं एक एक में 10 लिख सकते हैं
और ख में 14.
अब, इस बिंदु है जहां हम स्वैप के साथ आगे बढ़ना है.
तो लैपटॉप के लिए फिर से वापस flipping,
हम देखते हैं कि स्वैप काम करता है जिस तरह से मैं पहली बार एक और दुकान भिन्नता tmp में परिणाम है.
तो भिन्नता ऑपरेटर का कहना है कि, "अरे, एक पते के रूप में चर की सामग्री समझो.
जो भी उस पते पर संग्रहीत किया जाता है पर जाएँ, और इसे लोड. "
क्या आप चर के बाहर लोड हमारे tmp चर में संग्रहित किया जा रहा है.
IPad करने के लिए वापस Flipping.
अगर हम 10 को संबोधित करने के लिए जाना है, हम जानते हैं कि 10 पता varible x
क्योंकि हम हमारे बुलेट बिंदु है कि स्मृति में 10 x के पते के द्वारा कहा गया था.
तो हम वहाँ जाना है, इसका मूल्य है, जो 1 प्राप्त कर सकते हैं, जैसा कि हम हमारे iPad पर देखते हैं,
और tmp में है कि लोड.
फिर, यह अंतिम सामग्री नहीं है.
हम के माध्यम से चलने के लिए जा रहे हैं और हम अंत में हमारे कार्यक्रम के अंतिम राज्य के लिए मिल जाएगा.
लेकिन अब ठीक है, हम मूल्य 1 tmp में संग्रहीत है.
>> और यहाँ पर एक त्वरित सवाल है.
[अलेक्जेंडर] भिन्नता ऑपरेटर है - कि अभी चर के सामने सितारा सही है?
हाँ. >> भिन्नता ऑपरेटर तो, जैसा कि हम अपने लैपटॉप के लिए एक बार फिर से वापस फ्लिप,
सामने सही में इस स्टार है.
उस अर्थ में, यह है - आप यह गुणा ऑपरेटर के साथ विपरीत
जो दो चीजों की आवश्यकता है, भिन्नता ऑपरेटर एक एकल ऑपरेटर है.
बस एक मूल्य लागू एक द्विआधारी ऑपरेटर के रूप में करने का विरोध किया है,
जहां आप दो विभिन्न मूल्यों के लिए लागू होते हैं.
तो है कि इस लाइन में क्या होता है.
हम मान 1 भरी हुई है और यह हमारे अस्थायी पूर्णांक चर में संग्रहीत.
अगली पंक्ति, हम में ख की सामग्री की दुकान -
या, बल्कि, हम सामग्री है कि ख के लिए जगह है जहाँ एक ओर इशारा करते है में इशारा कर रहा है की दुकान.
अगर हम छोड़ दिया करने के लिए सही से इस का विश्लेषण, हम भिन्नता ख के लिए जा रहे हैं,
हम 14 को संबोधित करने के लिए जा रहे हैं, हम पूर्णांक है कि वहाँ है हड़पने के लिए जा रहे हैं,
और फिर हम 10 पते पर जाने के लिए जा रहे हैं,
और हम ख के हमारे भिन्नता का परिणाम है कि अंतरिक्ष में फेंक करने के लिए जा रहे हैं.
हमारे iPad, जहाँ हम इस एक छोटे से अधिक ठोस कर सकते हैं वापस Flipping,
यह अगर मैं सभी पतों की संख्या यहाँ लिखने के लिए मदद कर सकता है.
तो हम जानते हैं है कि y पर, हम 14 पते पर हैं, x 10 पते पर है.
जब हम ख में शुरू, हम भिन्नता ख, हम मान 2 हड़पने के लिए जा रहे हैं.
क्योंकि कि मूल्य है कि 14 पते पर रहता है हम इस मूल्य हड़पने के लिए जा रहे हैं.
और हम यह चर कि 10 पते पर रहता है में डाल जा रहे हैं,
जो अभी भी वहाँ है, हमारे चर x करने के लिए इसी.
तो हम यहाँ overwriting का एक छोटा सा कर सकते हैं
जहां हम 1 हमारे के छुटकारा पाने के लिए और बजाय हम एक 2 लिखने.
तो सब ठीक है और दुनिया में अच्छा है, यहां तक ​​कि हालांकि हम अधिलेखित x अब लिया है.
हम x हमारे tmp चर में पुराने मूल्य संग्रहीत है.
तो हम अगली पंक्ति के साथ स्वैप को पूरा कर सकते हैं.
हमारे लैपटॉप के लिए वापस Flipping.
अब सब कि रहता सामग्री हमारे अस्थायी पूर्णांक चर के बाहर ले जाना है
और उन्हें चर है कि पता है कि ख पकड़ रहा है पर रहता है में स्टोर.
तो हम भिन्नता ख के लिए प्रभावी ढंग से चर तक पहुँच पाने के लिए जा रहे हैं
है कि पता है कि ख में यह धारण है,
और हम मूल्य है कि tmp इसे में पकड़े हुए है सामान के लिए जा रहे हैं.
वापस iPad करने के लिए एक बार और अधिक Flipping.
मैं यह मान मिटा सकते हैं, 2,
और बदले हम इसे में 1 सही कॉपी कर देंगे.
फिर अगले पाठ्यक्रम की है कि executes लाइन,
अगर हम लैपटॉप वापस फ्लिप - इस बिंदु 6 है,
जो बिंदु है जिस पर हम हमारे आरेख पूरी तरह से भरे चाहता है.
तो iPad वापस flipping एक बार अधिक है, सिर्फ इतना आप पूरा आरेख देख सकते हैं,
आप देख सकते हैं कि हम एक में 10, ख में एक 14, एक tmp में 1, 2 एक्स और एक y में 1 है.
क्या इस बारे में कोई सवाल है?
क्या यह और अधिक समझ बनाने के लिए, यह माध्यम से चला गया?
कम समझ है? उम्मीद है कि नहीं है. ठीक है.
>> सूचक एक बहुत मुश्किल विषय हैं.
लोग हम साथ काम करने का एक बहुत ही आम कहावत है:
"करने के लिए संकेत समझने के लिए, आप पहली बार संकेत समझना चाहिए."
जो मुझे लगता है कि बहुत सही है. यह एक जबकि इसकी आदत हो ले.
चित्रों का बहुत आकर्षित, यह एक तरह स्मृति चित्र के बहुत ड्राइंग बहुत मददगार रहे हैं,
और उसके बाद आप उदाहरण के बाद उदाहरण के बाद उदाहरण के माध्यम से चलना,
यह एक छोटे से अधिक भावना और एक छोटे से अधिक भावना और एक छोटे से अधिक भावना बनाना शुरू करेंगे.
अंत में, एक दिन, तुम होगा यह सब पूरी तरह में महारत हासिल है.
कोई सवाल इससे पहले कि हम अगले समस्या पर चाल? सही सभी.
तो लैपटॉप वापस फ्लिप.
अगले समस्या हम समस्या 33 संख्या फ़ाइल पर मैं / ओ
यह एक छोटा सा पर ज़ूम.
33 समस्या - हाँ?
>> [डैनियल] मैं बस एक त्वरित सवाल था. इस स्टार, या तारांकन,
यह अपसंदर्भन जब आप एक asterisk से पहले का उपयोग कहा जाता है.
यह क्या है जब आप पहले एम्परसेंड का उपयोग कहा जाता है?
>> एम्परसेंड ऑपरेटर के पहले पता है.
तो चलो वापस ऊपर स्क्रॉल.
उफ़! मैं इसलिए मैं वास्तव में नहीं स्क्रॉल कर सकते हैं ज़ूम मोड में हूँ.
यदि हम इस कोड को सच में जल्दी देखो यहीं,
फिर, एक ही बात हो रहा है.
यदि हम इस कोड को सही यहाँ देखो, इस लाइन पर जहां हम कॉल स्वैप करने के लिए बना है,
एम्परसेंड बस कह रहा है "पता जिस पर चर x जीवन मिलता है."
जब अपने संकलक अपने कोड compiles,
यह वास्तव में शारीरिक रूप से अपने को जीने चर के सभी के लिए स्मृति में एक जगह चिह्नित है.
और तो संकलक क्या फिर एक बार यह सब कुछ संकलित कर सकते हैं,
यह जानता है, "ओह, मैं एक्स 10 पते पर डाल मैं 14 पते पर y डाला."
यह तो आप के लिए इन मूल्यों में भर सकते हैं.
तो तुम तो कर सकते हैं यह तो कर सकते हैं और के रूप में अच्छी तरह से पास वाई में यह पारित.
इन लोगों को पता हो, लेकिन वे भी, जब आप उन्हें स्वैप समारोह में पारित
इस प्रकार की जानकारी प्राप्त करने के लिए, यह int यहाँ * सही, संकलक बताता है,
"ठीक है, हम एक पूर्णांक चर के एक पते के रूप में इस पते की व्याख्या हो जा रहे हैं."
एक int के एक पते के रूप में, जो एक चरित्र चर के पते से अलग है
क्योंकि एक int एक 32-bit मशीन पर लेता है, अंतरिक्ष के 4 बाइट्स लेता है,
जबकि एक चरित्र केवल अंतरिक्ष के 1 बाइट लेता है.
तो यह भी पता है क्या है के लिए महत्वपूर्ण है - क्या रहता है, मान किस प्रकार
पता है कि अंदर पारित कर दिया गया पर रहने वाले
या पता है कि आप के साथ काम कर रहे हैं.
इस तरह, आप कैसे जानकारी के कई बाइट्स वास्तव में अपने रैम के लिए बाहर लोड पता है.
और फिर, हाँ, आप इस तरह भिन्नता ऑपरेटर, पूछ रहे थे,
चला जाता है और एक विशेष पते पर जानकारी तक पहुंचता है.
तो यह यह एक चर के साथ कहते हैं, यहाँ, एक पते के रूप में एक की सामग्री का इलाज,
कि पता करने के लिए जाना है, और बाहर खींच, प्रोसेसर, एक रजिस्टर में लोड में लोड
वास्तविक मूल्यों या सामग्री है कि उस पते पर रहते हैं.
अधिक कोई सवाल? ये अच्छे सवाल हैं.
यह नई शब्दावली का एक बहुत कुछ है.
यह भी कायरता की तरह है, और विभिन्न स्थानों में और * देख.
>> सही सभी.
तो 33 समस्या वापस दर्ज करने के लिए, मैं / ओ
यह उन समस्याओं में से एक है कि मुझे लगता है कि चीजों की एक जोड़ी हुआ था.
एक, यह एक काफी नया विषय है.
यह बहुत जल्द प्रश्नोत्तरी के समक्ष प्रस्तुत किया गया था,
और फिर मुझे लगता है कि यह एक गणित में उन समस्याओं के शब्द की तरह की तरह था
वे तुम्हें जहां जानकारी का एक बहुत देते हैं, लेकिन आप वास्तव में अंत नहीं है के लिए यह एक टन का उपयोग कर रही है.
इस समस्या के पहले भाग का वर्णन है एक CSV फ़ाइल क्या है.
अब, एक CSV फ़ाइल, वर्णन के अनुसार, एक कॉमा सेपरेटेड मान फ़ाइल है.
कारण इन सब मजे में हैं, और कारण है कि आप कभी भी उन्हें का उपयोग करें,
है, क्योंकि आप में से कितने कभी एक्सेल जैसे सामान का इस्तेमाल किया है?
आप में से ज्यादातर के चित्रा, शायद है, या अपने जीवन में कुछ बिंदु पर का उपयोग करेगा.
आप Excel की तरह कुछ का उपयोग करेंगे.
, आदेश में डेटा प्राप्त करने के लिए एक एक्सेल स्प्रेडशीट के बाहर या इसके साथ प्रसंस्करण के किसी भी प्रकार के कर
अगर आप एक सी प्रोग्राम या अजगर कार्यक्रम, जावा प्रोग्राम लिखना चाहता था,
डेटा आप वहाँ में संग्रहीत है के साथ सौदा करने के लिए,
एक सबसे आम तरीके इसे पाने के लिए बाहर की एक CSV फ़ाइल में है.
और आप Excel खोलने के लिए और कर सकते हैं जब आप बातचीत रूप में सहेजें 'के लिए जाना है,
तुम बाहर एक वास्तविक CSV फ़ाइल प्राप्त कर सकते हैं.
>> जानते हैं कि कैसे इन सब बातों के साथ निपटने के लिए आसान.
जिस तरह से यह काम करता है कि यह करने के लिए इसी तरह की है - मेरा मतलब है, यह अनिवार्य रूप से एक स्प्रेडशीट नकल उतार रहा है,
, के रूप में हम यहाँ देख बहुत छोड़ दिया सबसे टुकड़ा में, जहां,
हम सभी अंतिम नाम है.
तो हम Malan, तो Hardison, और फिर Bowden, MacWilliam, और फिर चान है.
सभी अंतिम नाम. और फिर एक अल्पविराम पहला नाम से अंतिम नामों को अलग करती है.
डेविड, नैट, रोब, टॉमी, और Zamyla.
मैं हमेशा रॉबी और टॉम मिश्रण.
और फिर, अंत में, तीसरे स्तंभ ईमेल पतों है.
एक बार जब आप समझते हैं कि, इस कार्यक्रम के बाकी को लागू करने के लिए काफी सरल है.
क्या हम क्रम में हमारे सी कार्यक्रम में यह एक ही संरचना की नकल करने के लिए किया है
हम एक संरचना का उपयोग किया है.
हम इन के रूप में अच्छी तरह से एक छोटे से अधिक के साथ खेल शुरू करेंगे.
हम उन्हें समस्या 3 सेट में, जब हम शब्दकोशों के साथ काम कर रहे थे 1 थोड़ा के लिए देखा था.
लेकिन यह स्टाफ struct कोई अंतिम नाम, प्रथम नाम, और एक ईमेल संग्रहीत करता है.
बस हमारे CSV फ़ाइल की तरह भंडारण किया गया था.
तो यह सिर्फ एक प्रारूप से दूसरे में परिवर्तित होता है.
हम इस मामले में कनवर्ट करने के लिए, एक लाइन में एक कर्मचारी struct,
ऐसे ही एक कॉमा सेपरेटेड लाइन.
क्या इसका यह मतलब है? तुम लोग सब प्रश्नोत्तरी ले लिया है,
तो मैं कल्पना आप कम से कम इस बारे में सोचने के लिए कुछ समय दिया है.
>> किराया समारोह में, हमें समस्या में लेने के लिए पूछता है - यह एक छोटा सा पर we'll ज़ूम
नाम के साथ एक कर्मचारी संरचना, एक कर्मचारी struct में ले,
और हमारे staff.csv फाइल करने के लिए अपनी सामग्री संलग्न.
यह पता चला है कि यह काफी का उपयोग करने के लिए सरल है.
हम किस तरह का ये एक छोटा सा और अधिक कार्य करता है के साथ आज के आसपास खेलेंगे.
लेकिन इस मामले में, fprintf समारोह वास्तव में महत्वपूर्ण है.
तो fprintf साथ, हम मुद्रित करने के लिए, बस तुम जैसे लोगों printf इस पूरे शब्द का उपयोग किया गया है.
आप printf एक फाइल करने के लिए एक लाइन कर सकते हैं.
तो सिर्फ सामान्य printf कॉल बनाने के बजाय जहां आप इसे प्रारूप स्ट्रिंग दे
और फिर आप निम्न तर्क के साथ सभी चर की जगह,
fprintf के साथ अपने पहले ही तर्क के बजाय फ़ाइल आप लिखना चाहते है.
अगर हम इस उपकरण में लग रही है, उदाहरण के लिए थे, fprintf आदमी,
हम printf और fprintf के बीच अंतर देख सकते हैं.
मैं यहाँ एक छोटा सा ज़ूम करेंगे.
तो printf के साथ, हम इसे देने के लिए एक प्रारूप स्ट्रिंग, और फिर बाद में तर्क
या हमारे प्रारूप स्ट्रिंग में प्रतिस्थापन प्रतिस्थापन के लिए सभी चर रहे हैं.
Fprintf साथ जबकि, पहला तर्क वास्तव में इस फाइल एक धारा * कहा जाता है.
>> यहाँ पर हमारे विमानों को वापस चल रहा है,
हम पहले से ही मिल गया है हमारे फ़ाइल * धारा हमारे लिए खोला गया.
यही इस पहली पंक्ति क्या करता है, यह staff.csv फ़ाइल को खोलता है,
यह जोड़ विधा में खुलती है, और है कि सभी के लिए हमें करने के लिए छोड़ दिया है
कर्मचारियों को फाइल करने के लिए संरचना लिखने.
और, चलो देखते हैं, मैं iPad का उपयोग करना चाहते हैं?
मैं iPad इस्तेमाल करेंगे. हम शून्य है - चलो मेज पर इस डाल तो मैं थोड़ा बेहतर लिख सकते हैं -
भाड़े के शून्य और यह एक बहस में लेता है, एक कर्मचारी संरचना बुलाया.
हमारे ब्रेसिज़ समझे, हम हमारे फ़ाइल बुलाया * मिल गया है,
हम हमारे fopen लाइन हमें करने के लिए दिया है,
और मैं सिर्फ यह डॉट्स के रूप में लिखने के बाद से यह पिडिया में पहले से ही है.
और फिर हमारी अगली पंक्ति पर, हम fprintf के लिए एक कॉल करने के लिए जा रहे हैं
और हम फ़ाइल में पारित करने के लिए जा रहे हैं कि हम मुद्रित करने के लिए करना चाहते हैं,
और फिर हमारे प्रारूप स्ट्रिंग, जो -
मैं दूँगा आप लोग मुझे बता सकते हैं कि यह क्या की तरह दिखता है.
कैसे तुम्हारे बारे में, स्टैला? क्या आप जानते हैं क्या प्रारूप स्ट्रिंग के पहले भाग की तरह लग रहा है?
[स्टेला] मुझे यकीन नहीं कर रहा हूँ. >> जिमी पूछने के लिए स्वतंत्र महसूस.
क्या आप जानते हैं, जिमी?
[जिमी] यह सिर्फ पिछले होना चाहेंगे? मुझे नहीं मालूम. मैं पूरी तरह यकीन नहीं कर रहा हूँ.
ठीक है. >> कैसे के बारे में किसी को भी परीक्षा पर यह सही है?
सब ठीक नहीं है.
यह पता चला है कि यहाँ हम सभी को करना है कि हम हमारे स्टाफ संरचना के प्रत्येक भाग चाहते
हमारे फ़ाइल में एक स्ट्रिंग के रूप में मुद्रित किया जा.
हम सिर्फ स्ट्रिंग प्रतिस्थापन चरित्र तीन अलग अलग समय का उपयोग करें, क्योंकि हम एक अंतिम नाम है
अल्पविराम द्वारा पीछा किया, तो पहला नाम एक अल्पविराम के द्वारा पीछा किया,
और फिर अंत में ईमेल पते जो पीछा किया जाता है - जो नहीं है
अपनी स्क्रीन पर फिटिंग लेकिन यह एक newline चरित्र द्वारा पीछा है.
तो मैं यह सिर्फ वहाँ नीचे लिखने के लिए जा रहा हूँ.
और फिर हमारे प्रारूप स्ट्रिंग के बाद,
हम सिर्फ substitutions है, जो हम डॉट संकेतन का उपयोग का उपयोग
कि हम समस्या 3 सेट में देखा.
हम s.last, s.first का उपयोग कर सकते हैं, और s.email
हमारे प्रारूप स्ट्रिंग में उन तीन मूल्यों में स्थानापन्न.
तो कैसे जाना था? मतलब होता है?
हाँ? नहीं? संभवतः? ठीक है.
>> अंतिम बात यह है कि हम ऐसा करने के बाद हम और मुद्रित है के बाद हम अपने फ़ाइल खोल दिया है:
जब भी हम एक फ़ाइल खोल दिया है, हम हमेशा के लिए इसे बंद करने के लिए याद है.
क्योंकि अन्यथा हम अंत में स्मृति लीक कर रहा हूँ,
फ़ाइल descriptors का उपयोग.
तो इसे बंद करने के लिए, समारोह जो हम इस्तेमाल करते हैं? डेनियल?
[डैनियल] fclose? >> Fclose, बिल्कुल.
तो इस समस्या के अंतिम भाग के लिए ठीक से फ़ाइल करीब था, fclose समारोह का उपयोग कर,
जो ऐसे ही लग रहा है.
नहीं भी पागल.
कूल.
तो यह है कि 33 प्रश्नोत्तरी पर समस्या है.
हम निश्चित रूप से अधिक फ़ाइल मैं / हे आ रहा हूँ.
हम थोड़ा अधिक आज के व्याख्यान में करते हैं, या अनुभाग में आज,
क्योंकि है कि क्या करने के लिए इस आगामी pset के थोक रूप जा रहा है.
चलो इस बिंदु पर प्रश्नोत्तरी से स्थानांतरित. हाँ?
>> [Charlotte]] क्यों fclose के बजाय (फ़ाइल) fclose (staff.csv)?
आह. >> क्योंकि यह पता चला है कि - तो सवाल है, जो एक महान एक है,
है, जब हम fclose लिखना क्यों, हम fclose (फ़ाइल) स्टार चर लिख रहे हैं
के रूप में फ़ाइल नाम, staff.csv विरोध? कि सही है? हाँ.
तो चलो एक नज़र रखना. यदि मैं अपने लैपटॉप के लिए वापस स्विच,
और fclose समारोह में देखो.
तो fclose समारोह एक धारा को बंद कर देता है और यह सूचक में धारा है कि हम बंद करना चाहते हैं पर ले जाता है,
के रूप में वास्तविक फ़ाइल नाम है कि हम बंद करना चाहते हैं विरोध.
और इस वजह से पर्दे के पीछे है, जब आप fopen के लिए एक फोन कर
जब आप एक फ़ाइल खोलने के लिए, आप वास्तव में स्मृति आवंटन कर रहे हैं फ़ाइल के बारे में जानकारी की दुकान.
तो आप फ़ाइल सूचक है कि फाइल के बारे में जानकारी नहीं है,
इस तरह के रूप में यह खुला है, इसके आकार, जहां आप फ़ाइल में वर्तमान में कर रहे हैं,
इतनी है कि आप पढ़ने और लेखन है कि विशेष रूप से जगह के लिए फ़ाइल के भीतर कॉल कर सकते हैं.
तुम अंत में फ़ाइल नाम को बंद करने के बजाय सूचक बंद.
>> हाँ? [डैनियल] तो क्रम में किराया का उपयोग करने के लिए, आप कहना होगा - यह उपयोगकर्ता इनपुट कैसे मिलता है?
क्या fprintf भावना में GetString तरह कार्य है कि यह सिर्फ उपयोगकर्ता इनपुट के लिए इंतजार करेंगे
और आप इस प्रकार के लिए पूछ - या इंतजार के लिए आप इन तीन बातों में टाइप करने के लिए?
या आप कुछ का उपयोग भाड़े को लागू करने की जरूरत है?
>> हाँ. सवाल, कैसे कर रहा था हम उपयोगकर्ता इनपुट मिल - तो हम नहीं कर रहे हैं
क्रम में किराया को लागू करने के लिए? और क्या हम यहाँ है भाड़े के फोन करने वाले है,
struct में पहले से संग्रहीत डेटा के सभी के साथ इस कर्मचारी struct में पारित कर दिया.
तो fprintf सिर्फ इतना है कि डेटा फ़ाइल के लिए सीधे लिखने के लिए सक्षम है.
वहाँ कोई उपयोगकर्ता इनपुट के लिए इंतज़ार कर रहे है.
उपयोगकर्ता पहले से ही इसे ठीक इस स्टाफ struct में डाल इनपुट दिया.
और चीजें हैं, निश्चित रूप से, अगर उन संकेत के किसी भी अशक्त थे तोड़ना होगा,
तो हम वापस यहाँ स्क्रॉल करें और हम अपने struct को देखो.
हम स्ट्रिंग अंतिम स्ट्रिंग, 1, स्ट्रिंग ईमेल है.
अब हम जानते हैं कि उन वास्तव में सभी हुड के तहत, चार * चर रहे हैं.
अशक्त करने की ओर इशारा करते हुए हो सकता है या नहीं.
वे ढेर पर स्मृति की ओर इशारा करते हुए किया जा सकता है,
शायद ढेर पर स्मृति.
हम वास्तव में नहीं पता नहीं है, लेकिन अगर ये संकेत किसी भी अशक्त, या अवैध हैं,
जो कि निश्चित रूप से हमारे किराया समारोह दुर्घटना करेंगे.
यह कुछ ऐसा है कि परीक्षा के दायरे से परे तरह का था था.
हम उस बारे में चिंता नहीं कर रहे हैं.
बढ़िया है. ठीक है. तो प्रश्नोत्तरी से बढ़ रहा है.
>> चलो इस आदमी को बंद करते हैं, और हम pset 4 में लग जा रहे हैं.
तो अगर आप लोगों pset कल्पना को देखो, एक बार आप इसे का उपयोग कर सकते हैं, cs50.net/quizzes,
हम अनुभाग आज की समस्याओं के कुछ के माध्यम से जाने के लिए जा रहे हैं.
मैं नीचे स्क्रॉल कर रहा हूँ - सवालों के अनुभाग pset कल्पना की 3 पेज पर शुरू होता है.
और 1 हिस्सा पूछता है तुम जाओ और पुनः निर्देशित कर और पाइप पर कम घड़ी.
जो एक ठंडी कम की तरह था, तो आप कुछ नए, शांत कमांड लाइन चाल से पता चलता है कि आप उपयोग कर सकते हैं.
और फिर हम आप के लिए कुछ सवाल के रूप में अच्छी तरह से मिल गया है.
नदियों के बारे में यह पहला सवाल जो printf डिफ़ॉल्ट रूप से लिखते हैं,,
हम किस तरह का सिर्फ एक छोटा सा पर एक पल पहले छुआ.
इस fprintf कि हम चर्चा कर रहे थे अपने तर्क के रूप में एक फ़ाइल * धारा में लेता है.
fclose एक फ़ाइल * धारा में के रूप में अच्छी तरह से लेता है,
और fopen का वापसी मान आप एक फ़ाइल * धारा के रूप में अच्छी तरह से देता है.
कारण है कि हम से पहले उन लोगों को नहीं देखा जब हम printf के साथ निपटा दिया है
क्योंकि printf एक डिफ़ॉल्ट धारा है.
और डिफ़ॉल्ट धारा है जो इसे लिखते
तुम बाहर के बारे में संक्षेप में मिल जाएगा.
तो निश्चित रूप से इस पर एक नज़र रखना.
>> आज के अनुभाग में, हम GDB के बारे में थोड़ा बहुत बात करते जा रहे हैं,
के बाद से अधिक परिचित आप इसके साथ कर रहे हैं, और अधिक अभ्यास आप इसके साथ मिलता है,
बेहतर करने में सक्षम है कि आप वास्तव में अपने खुद के कोड में कीड़े का शिकार हो जाएगा.
यह काफी debugging की प्रक्रिया को गति.
तो printf का उपयोग करके, हर बार आपको लगता है कि आप अपने कोड recompile,
आप इसे फिर से चलाने के लिए है, कभी कभी आप printf कॉल के आसपास स्थानांतरित करने के लिए किया है,
बाहर कोड टिप्पणी करने के लिए, यह सिर्फ एक समय लेता है.
हमारे लक्ष्य के लिए प्रयास करें और आपको समझाने की है कि GDB के साथ, आप अनिवार्य रूप से कर सकते हैं
printf कुछ भी आप अपने कोड में किसी भी बिंदु पर है और कभी नहीं करने के लिए यह recompile.
आप कभी नहीं शुरू करने के लिए और जहां printf अगले ख्याल रखना.
पहली बात करने के लिए इस लाइन को कॉपी और अनुभाग कोड वेब का उतरना है.
मैं कोड की इस पंक्ति है कि कहते हैं, 'wget http://cdn.cs50.net "की नकल कर रहा हूँ.
मैं इसे कॉपी करने के लिए जा रहा हूँ.
मैं अपने उपकरण के लिए जा रहा हूँ, बाहर ज़ूम तो आप देख सकते हैं कि मैं क्या कर रहा हूँ,
यह वहाँ में चिपकाने, और जब मैं हिट दर्ज करें, इस wget समादेश सचमुच एक वेब मिल.
यह नीचे इंटरनेट के इस फ़ाइल को खींचने के लिए रवाना हो रहा है,
और इसे मौजूदा निर्देशिका में बचाने के लिए जा रहा है.
अब अगर मैं अपने वर्तमान निर्देशिका की सूची आप देख सकते हैं कि मैं सही में वहाँ इस section5.zip फ़ाइल मिल गया है.
उस आदमी के साथ सौदा करने के लिए जिस तरह से इसे खोलना है,
जो आप कमांड लाइन में सिर्फ इस तरह कर सकते हैं.
Section5.zip.
कि इसे खोलना होगा, मेरे लिए फ़ोल्डर बनाने के लिए,
सामग्री के सभी फुलाना, उन्हें वहाँ में डाल दिया.
तो अब मैं अपने अनुभाग 5 सीडी कमांड का उपयोग निर्देशिका में जा सकते हैं.
स्पष्ट का उपयोग कर स्क्रीन साफ. तो स्क्रीन साफ.
अब मैं एक अच्छा साफ के साथ सौदा करने के लिए टर्मिनल के लिए मिल गया है.
>> अब अगर मैं सभी फ़ाइलों है कि मैं इस निर्देशिका में देखने की सूची,
आप देखते हैं कि मैं चार फाइलें मिल गया है: buggy1, buggy2, buggy3, और buggy4.
मैं भी उनके इसी ग फ़ाइलें मिल गया है.
हम अब के लिए ग फ़ाइलों को देखने के लिए नहीं जा रहे हैं.
इसके बजाय, हम उन का उपयोग जब हम GDB को खोलने के लिए जा रहे हैं.
हम उन्हें रखा है चारों ओर इतना है कि हम वास्तविक स्रोत कोड के लिए उपयोग कर सकते है जब हम GDB का उपयोग कर रहे हैं,
लेकिन खंड के इस भाग के लक्ष्य GDB के साथ चारों ओर टिंकर करने के लिए है
देखते हैं और कैसे हम इसे उपयोग करने के लिए बाहर निकालने के लिए इन चार छोटी गाड़ी कार्यक्रमों में से प्रत्येक के साथ क्या गलत हो रहा है कर सकते हैं.
तो हम सिर्फ कमरे में चारों ओर कर रहे हैं सच में जल्दी जा रहा है,
और मैं किसी को पूछने के लिए एक छोटी गाड़ी कार्यक्रमों के चलने के लिए जा रहा हूँ,
और फिर हम GDB के माध्यम से एक समूह के रूप में जाना है, और हम देखेंगे कि हम क्या करने के लिए इन कार्यक्रमों को ठीक कर सकते हैं,
या कम से कम की पहचान करने के लिए उनमें से प्रत्येक में क्या गलत हो रहा है.
चलो डैनियल के साथ यहाँ शुरू. तुम buggy1 चलेगा? चलो देखते हैं कि क्या होता है.
[डैनियल] यह कहना है कि वहाँ एक आवेदन गलती है. >> हाँ. बिल्कुल सही.
तो अगर मैं buggy1 चलाने के लिए, मैं एक seg गलती मिलता है.
इस बिंदु पर, मैं जाकर buggy1.c खोल सकता है,
कोशिश करते हैं और पता लगाने की क्या गलत हो रहा है,
लेकिन एक seg गलती त्रुटि के बारे में सबसे अप्रिय बातें
यह है कि यह कार्यक्रम चीजों में से एक लाइन वास्तव में क्या गलत हो गया था और तोड़ दिया पर बता नहीं है.
आप किस तरह का कोड को देखो
और अनुमान का उपयोग कर बाहर आंकड़ा और जांच या printf देखने के लिए कि क्या गलत हो रहा है.
GDB बारे में coolest चीजों में से एक यह है कि यह वास्तव में, वास्तव में आसान है
करने के लिए बाहर आंकड़ा लाइन पर जो अपने कार्यक्रम दुर्घटनाओं.
यह पूरी तरह से यह उपयोग करने के लिए लायक है, भले ही सिर्फ उस के लिए.
GDB बूट तो, मैं GDB टाइप करें, और फिर मैं यह निष्पादन योग्य है कि मैं चलाने के लिए करना चाहते हैं के लिए रास्ता दे.
यहाँ मैं ./buggy1 gdb टाइप कर रहा हूँ.
हिट दर्ज करें. मुझे यह सब कॉपीराइट जानकारी देता है,
और यहाँ नीचे आप इस लाइन कहते हैं, "घर / / से पढ़ना प्रतीकों देखेंगे
jharvard/section5/buggy1. "
और अगर सब कुछ ठीक हो जाता है, आप देखेंगे कि यह एक संदेश है कि इस तरह दिखता प्रिंट.
यह प्रतीकों को पढ़ा होगा, यह कहना है "मैं अपने निष्पादन योग्य फ़ाइल से प्रतीक पढ़ रहा हूँ,"
और फिर इसे यहाँ पर इस "किया" संदेश होगा.
यदि आप इस के कुछ अन्य बदलाव देखते हैं, या आप देख यह प्रतीक नहीं मिल सकता है
या कुछ की तरह है कि, क्या इसका मतलब है कि आप सिर्फ अपने निष्पादन ठीक नहीं संकलित किया है.
GDB के साथ उपयोग करने के लिए जब हम कार्यक्रमों संकलन करने के लिए, हम कि विशेष जी ध्वज का उपयोग किया है,
और जो मूलभूत रूप से किया है अगर आप अपने कार्यक्रमों संकलन सिर्फ टाइपिंग बनाने के द्वारा,
या छोटी गाड़ी बनाने के लिए या ठीक बनाने के लिए, उन में से किसी के.
लेकिन यदि आप मैन्युअल बजना साथ संकलन कर रहे हैं, तो आप में जाओ और है कि छ ध्वज शामिल होगा.
>> इस बिंदु पर, अब है कि हम अपने GDB प्रॉम्प्ट है,
यह बहुत आसान है इस कार्यक्रम को चलाने के.
हम या तो रन टाइप कर सकते हैं, या हम सिर्फ r टाइप कर सकते हैं.
अधिकांश GDB आज्ञाओं संक्षिप्त हो सकता है.
आम तौर पर सिर्फ एक या दो पत्र है, जो बहुत अच्छा है.
तो साद, अगर आप टाइप और हिट दर्ज करें, क्या होता है?
[साद] मैं SIGSEGV, विभाजन गलती है, और फिर यह सब gobbledygook मिला.
>> हाँ.
जैसे हम स्क्रीन पर देख रहे हैं अभी, और जैसे साद ने कहा,
जब हम भाग या r टाइप करें और हिट दर्ज करें, हम अभी भी एक ही seg गलती मिलता है.
तो GDB का उपयोग हमारी समस्या का समाधान नहीं है.
लेकिन यह हमें कुछ gobbledygook देता है, और यह पता चला है कि इस gobbledygook
वास्तव में हमें बताता है जहां यह हो रहा है.
यह एक छोटा सा पार्स, यह पहली बिट समारोह में सब कुछ गलत हो रहा है है.
इस strcmp_sse4_2 __ है, और यह हमें बताता है कि यह इस फाइल में हो रहा है
कहा जाता sysdeps/i386, यह सब, फिर से, एक गड़बड़ की तरह है - लेकिन 254 लाइन.
उस तरह का पार्स करने के लिए मुश्किल है. आमतौर पर जब आप इस तरह से चीजें देखते हैं,
इसका मतलब है कि यह एक प्रणाली पुस्तकालयों में दोषयुक्त seg है.
तो strcmp साथ क्या करने के लिए कुछ है. तुम लोग strcmp पहले देखा है.
पागल है, नहीं भी है, लेकिन इसका मतलब यह है कि strcmp या टूट जाता है कि वहाँ के साथ एक समस्या है strcmp करता है?
तुझे क्या अलेक्जेंडर लगता है?
[अलेक्जेंडर] है कि 254 लाइन है? और द्विपदीय नहीं है, लेकिन यह अपनी छत नहीं है,
और फिर वहाँ प्रत्येक समारोह के लिए एक और भाषा है. यह है कि उस समारोह में 254 या?
>> यह 254 लाइन है. यह इस फ़ाइल में की तरह लग रहा है, तो इसे विधानसभा शायद कोड.
>> लेकिन, मुझे लगता है कि ज्यादा चिंताजनक बात है, क्योंकि हम एक seg गलती मिल गया है,
और ऐसा लगता है जैसे यह strcmp समारोह से आ रहा है,
क्या यह मतलब है, तो, कि strcmp टूट गया है?
, उम्मीद है कि यह नहीं होना चाहिए. तो सिर्फ इसलिए कि आप एक विभाजन गलती
एक प्रणाली के कार्यों में, आम तौर पर मतलब है कि है कि तुम सिर्फ इसे सही ढंग से नहीं बुलाया है.
तेज बात यह पता लगाने की क्या वास्तव में चल रहा है
, जब आप पागल कुछ इस तरह, जब भी आप एक seg गलती देख
खासकर यदि आप एक प्रोग्राम है कि अधिक से अधिक सिर्फ मुख्य का उपयोग कर रहा है,
एक backtrace का उपयोग करने के लिए है.
मैं बीटी लेखन, रूप में पूर्ण बैकट्रैस शब्द विरोध बैकट्रैस संक्षिप्त.
लेकिन Charlotte, क्या होता है जब आप बीटी टाइप और हिट दर्ज करें?
[Charlotte] यह मुझे दो लाइनों, लाइन 0 और 1 लाइन से पता चलता है.
>> हाँ. तो लाइन 0 और लाइन 1.
वास्तविक ढेर फ्रेम कि नाटक में वर्तमान में थे जब अपने कार्यक्रम के दुर्घटनाग्रस्त हो जाने से हैं.
सर्वोच्च फ्रेम, फ्रेम 0 से शुरू है, और सबसे नीचे है, जो 1 फ्रेम करने के लिए जा रही है.
हमारी सर्वोच्च फ्रेम strcmp फ्रेम है.
आप इस बारे में सोच के रूप में हम सिर्फ संकेत के साथ प्रश्नोत्तरी पर कर रहे थे कि समस्या की तरह कर सकते हैं,
जहां हम मुख्य ढेर फ्रेम के शीर्ष पर स्टैक फ्रेम स्वैप था,
और हम चर है कि स्वैप चर कि मुख्य का उपयोग कर रहा था के शीर्ष पर का उपयोग कर रहा था था.
यहाँ हमारे दुर्घटना हमारे strcmp समारोह, जो हमारी मुख्य समारोह से बुलाया गया था में हुआ,
और बैकट्रैस हमें न केवल कार्य करता है जो बातें में विफल रहा है दे रहा है,
लेकिन यह भी हमें बता रहा है, जहां सब कुछ से बुलाया गया था.
तो अगर मैं एक छोटे से अधिक से अधिक सही करने के लिए स्क्रॉल,
हम देख सकते हैं कि हाँ, हम इस फ़ाइल strcmp sse4.s के 254 लाइन पर थे.
लेकिन कॉल buggy1.c, 6 लाइन में बनाया गया था.
तो इसका मतलब है कि हम क्या कर सकते है - हम सिर्फ बाहर की जाँच कर सकते हैं और देखने के लिए क्या हो रहा था
buggy1.c, 6 लाइन में.
फिर, वहाँ एक दो तरीके से ऐसा कर रहे हैं. GDB से बाहर निकलें
है या अपने कोड एक और खिड़की और पार संदर्भ में खुला.
यही है, और खुद की, बहुत आसान है क्योंकि अब अगर आप कार्यालय समय पर कर रहे हैं
और आप एक seg गलती मिल गया है और अपने TF सोच रहा है जहां सब कुछ टूट गया था,
आप बस का कहना है, "ओह, 6 लाइन कर सकते हैं मैं नहीं जानता कि क्या हो रहा है,
लेकिन 6 लाइन के बारे में कुछ मेरे कार्यक्रम को तोड़ने के लिए पैदा कर रहा है. "
अन्य तरीका यह करना है आप इस सूची GDB में बुलाया आदेश का उपयोग कर सकते हैं.
आप यह भी एल के साथ संक्षिप्त कर सकते हैं.
तो अगर हम एल मारा, हम यहाँ क्या मिलता है?
हम अजीब सामान की एक पूरी गुच्छा मिलता है.
यह वास्तविक विधानसभा कोड है
है कि strcmp_sse4_2 में है.
यह कायरता की तरह लग रहा है,
और कारण है कि हम यह हो रही है क्योंकि अब ठीक है,
GDB हमें 0 फ्रेम में है.
>> तो हम कभी भी देखने के चर में, किसी भी समय हम स्रोत कोड को देखो,
हम स्रोत कोड को देख रहे हैं कि स्टैक फ्रेम से संबंधित वर्तमान में हम अंदर हो
तो क्रम में सार्थक कुछ भी प्राप्त करने के लिए, हम करने के लिए है
एक ढेर फ्रेम कि अधिक समझ में आता है करने के लिए कदम.
इस मामले में, मुख्य ढेर फ्रेम एक छोटे से अधिक मतलब होगा,
क्योंकि है कि वास्तव में कोड है कि हम ने लिखा था.
Strcmp कोड.
जिस तरह से आप फ्रेम के बीच ले जाने के लिए, इस मामले में कर सकते हैं, क्योंकि हम दो है,
हम 0 और 1,
आप ऊपर और नीचे कमांड के साथ करते हैं कि.
अगर मैं एक फ्रेम ले जाते हैं,
अब मैं मुख्य ढेर फ्रेम में हूँ.
मैं नीचे स्थानांतरित करने के लिए मैं कहाँ था वापस जा सकते हैं,
फिर से जाने के लिए, फिर से जाना है, और फिर से जाना.
यदि आप कभी भी GDB में अपने कार्यक्रम करते हैं, तो आप एक दुर्घटना हो, आप बैकट्रैस मिलता है,
और आप देखेंगे कि यह कुछ फ़ाइल है कि तुम नहीं जानते कि क्या हो रहा है में है.
आप सूची की कोशिश, कोड आप परिचित नहीं लगती है,
अपने तख्ते पर एक नज़र रखना और बाहर आंकड़ा तुम कहाँ हो.
आप शायद गलत ढेर फ्रेम में कर रहे हैं.
या कम से कम आप एक ढेर फ्रेम कि एक नहीं है कि आप वास्तव में डिबग कर सकते हैं में कर रहे हैं.
अब है कि हम उचित ढेर फ्रेम में कर रहे हैं, हम मुख्य हैं,
अब हम सूची आदेश का उपयोग यह पता लगाने रेखा क्या कर सकते हैं.
और आप इसे देख सकते हैं, यह हमारे लिए सही यहाँ मुद्रित.
लेकिन हम सब एक ही सूची हिट कर सकते हैं, और सूची हमें यह अच्छा प्रिंटआउट देता है
वास्तविक स्रोत कोड है कि यहाँ पर जा रहा है.
>> विशेष रूप से, हम 6 लाइन पर देख सकते हैं.
हम देख सकते हैं कि यहाँ क्या हो रहा है.
और ऐसा लगता है जैसे हम एक स्ट्रिंग तुलना कर रहे हैं
स्ट्रिंग "CS50 चट्टानों" और argv के बीच [1].
इस बारे में कुछ दुर्घटनाग्रस्त था.
Missy तो, तुम क्या हो रहा हो सकता है यहाँ पर कोई विचार है?
[Missy] मैं क्यों यह दुर्घटनाग्रस्त है पता नहीं है. >> आप क्यों यह दुर्घटनाग्रस्त है पता नहीं है?
जिमी, किसी भी विचार?
[जिमी] मैं पूरी तरह यकीन नहीं कर रहा हूँ, लेकिन पिछली बार जब हम स्ट्रिंग इस्तेमाल किया की तुलना,
या strcmp, हम इसके तहत तीन अलग - अलग मामलों की तरह था.
हम एक == नहीं था, मैं सही है कि पहली पंक्ति में नहीं लगता है, नहीं है.
इसके बजाय यह तीन में अलग हो गया था, और एक == 0 था,
एक था <0, मुझे लगता है, और एक> 0.
तो उस तरह शायद कुछ और? >> हाँ. तो इस मुद्दे
हम तुलना कर रहे हैं सही ढंग से कर रहे हैं?
स्टेला? किसी भी विचार?
[स्टेला] मुझे यकीन नहीं कर रहा हूँ. सुनिश्चित नहीं हैं. >> डेनियल? विचार? ठीक है.
यह पता चला है सही में यहाँ क्या हो रहा है जब हम कार्यक्रम भागा
और हम seg गलती है, जब आप पहली बार के लिए कार्यक्रम, डैनियल दौड़ा,
आप इसे किसी भी कमांड लाइन तर्क दे?
[डैनियल] नहीं >> सं. उस मामले में, क्या argv के मूल्य [1]?
>> का कोई मूल्य नहीं है. >> ठीक है.
ठीक है, वहाँ कोई उपयुक्त स्ट्रिंग मान है.
लेकिन वहाँ कुछ मूल्य है. क्या मूल्य है कि वहाँ में जमा हो जाता है?
>> एक कचरा मूल्य है? >> यह या तो एक कचरा मान है या इस मामले में,
argv सरणी के अंत हमेशा बातिल के साथ समाप्त होता है.
तो क्या वास्तव में संग्रहीत गया रिक्त है.
अन्य तरह से हल करने के लिए है, यह सोच के माध्यम से नहीं बल्कि,
यह मुद्रण बाहर करने की कोशिश है.
यह वह जगह है जहाँ मैं कह रहा था कि GDB का उपयोग महान है,
क्योंकि तुम बाहर सभी चर मुद्रित कर सकते हैं, सभी मूल्यों है कि आप चाहते हैं
इस काम - बांका पी आदेश का उपयोग.
तो अगर मैं पी लिखें और फिर मैं एक चर या एक चर के नाम का मान लिखें,
कहते हैं, argc, मैं देख रहा हूँ कि argc 1 है.
अगर मैं बाहर argv मुद्रित करना चाहते [0], मैं तो बस ऐसे ही कर सकते हैं.
और जैसा कि हमने देखा, argv [0] हमेशा अपने कार्यक्रम का नाम है,
हमेशा निष्पादन के नाम.
यहां आप देख यह पूर्ण पथ नाम मिल गया है.
मैं भी बाहर प्रिंट argv [1] और देखो क्या होता है.
>> यहाँ हम रहस्यमय मूल्य के इस तरह मिल गया.
हम इस 0x0 मिला.
अवधि की शुरुआत में जब हम षोडश संख्या के बारे में बात की याद है?
या कैसे हेक्स में 50 का प्रतिनिधित्व करने के बारे में कि 0 pset के अंत में एक छोटे सवाल?
जिस तरह से हम सीएस में हेक्स संख्या लिखते हैं, सिर्फ खुद को भ्रमित करने के लिए नहीं
दशमलव संख्या के साथ है, हम हमेशा उन्हें 0x से उपसर्ग.
तो इस 0x के हमेशा सिर्फ मतलब है कि एक हेक्साडेसिमल संख्या के रूप में निम्नलिखित संख्या व्याख्या,
एक स्ट्रिंग के रूप में नहीं, नहीं एक दशमलव संख्या के रूप में नहीं एक द्विआधारी संख्या के रूप में.
चूंकि 5-0 संख्या हेक्साडेसिमल में एक वैध संख्या है.
और यह दशमलव, 50 में एक नंबर है.
तो यह है कि बस कैसे हम disambiguate.
तो 0x0 0 षोडश आधारी साधन है, जो भी दशमलव 0 0 द्विआधारी.
यह सिर्फ मान 0 है.
यह पता चला है कि इस अशक्त क्या है, वास्तव में स्मृति में.
अशक्त है 0.
यहाँ, तत्व argv [1] में संग्रहीत रिक्त है.
तो हम एक रिक्त स्ट्रिंग के लिए हमारे "CS50 चट्टानों" स्ट्रिंग की तुलना करने की कोशिश कर रहे हैं.
तो अशक्त अपसंदर्भन, अशक्त में चीजों का उपयोग करने की कोशिश कर रहा है,
वे आम तौर पर विभाजन गलती या अन्य बुरी बातें होने का किसी प्रकार का कारण करने के लिए जा रहे हैं.
और यह पता चला कि strcmp देखना जाँच नहीं करता
चाहे या नहीं आप एक मूल्य है कि अशक्त में पारित कर दिया है.
बल्कि, यह सिर्फ आगे चला जाता है, अपनी बात करने की कोशिश करता है,
और अगर यह दोष seg, यह दोष seg, और यह आपकी समस्या है. तुम जाने के लिए इसे ठीक कर दिया है.
वास्तव में, जल्दी से, कैसे हम इस समस्या को ठीक कर सकता है? Charlotte?
[Charlotte] यदि आप का उपयोग की जांच कर सकते हैं.
तो अगर argv [1] रिक्त है, == 0, तो 1 लौटने के लिए, या कुछ [unintelligible]
>> हाँ. तो यह है कि एक महान तरीका यह करना है, जैसा कि हम देखने के लिए जाँच कर सकते हैं,
मूल्य के बारे में हम strcmp में पारित करने के लिए कर रहे हैं, argv [1], यह रिक्त है?
अगर यह अशक्त है, तो हम ठीक कहते हैं, गर्भपात कर सकते हैं.
>> एक अधिक सामान्य तरीका यह करने के लिए argc मूल्य का उपयोग करने के लिए है.
तुम यहीं मुख्य की शुरुआत में देख सकते हैं,
हम कि पहला परीक्षण लोप कर दिया है कि हम आम तौर पर जब हम कमांड लाइन तर्क का उपयोग,
जो परीक्षण करने के लिए किया जाए या नहीं, हमारे argc मूल्य है कि हम क्या उम्मीद है.
इस मामले में, हम कम से कम दो तर्कों की उम्मीद कर रहे हैं,
कार्यक्रम के नाम के साथ एक अन्य.
क्योंकि हम दूसरा तर्क के बारे में सही यहाँ का उपयोग कर रहे हैं.
तो परीक्षण के कुछ प्रकार पहले हमारे strcmp फोन से पहले,
कि परीक्षण किया जाए या नहीं argv कम से कम 2 है, भी बात की ही तरह करना होगा.
हम देख सकते हैं कि अगर उस कार्यक्रम फिर से चलाने के द्वारा काम करता है.
तुम हमेशा GDB, जो वास्तव में अच्छा है के भीतर अपने कार्यक्रम को पुनः आरंभ कर सकते हैं.
आप चलाने के लिए, और जब आप अपने कार्यक्रम के लिए बहस में पारित कर सकते हैं,
आप उन्हें जब आप चलाने के फोन में पारित नहीं, जब आप GDB बूट.
इस तरह आप अलग तर्क के साथ अपने कार्यक्रम हर बार लागू रख सकते हैं.
तो चलाने के लिए, या फिर, मैं r टाइप कर सकते हैं, और देखते हैं क्या होगा अगर हम टाइप होता है "नमस्ते".
यह हमेशा आप से पूछना अगर आप शुरू से ही इसे फिर से शुरू करना चाहते हैं.
आमतौर पर, आप शुरू से ही इसे फिर से शुरू करना चाहते हैं.
और इस बिंदु पर, यह restarts इसे फिर से, यह बाहर प्रिंट
प्रोग्राम है कि हम चल रहे हैं, रहे हैं तर्क नमस्ते के साथ buggy1,,
और यह इस मानक बाहर प्रिंट, इसे कहते हैं, "आप एक डी मिलता है," उदास चेहरे.
लेकिन हम गलती नहीं seg था. यह कहा कि प्रक्रिया सामान्य रूप से बाहर निकल गया.
तो यह है कि बहुत अच्छा लग रहा है.
कोई और अधिक seg गलती है, हम यह पिछले बनाया,
तो यह लगता है कि वास्तव में हो रहे थे कि हम seg गलती बग था.
दुर्भाग्य से, यह हमें बताता है कि हम एक डी. हो रही है
>> हम वापस जाने के लिए और कोड को देखो कर सकते हैं और वहाँ क्या हो रहा था
पता लगाने की क्या था - क्यों यह हमें बता रहा था कि हम एक डी. मिला
चलो देखते हैं, यहाँ इस printf कह रही है कि आप एक डी. मिला
अगर हम सूची टाइप करें, के रूप में आप टाइप सूची रखने के लिए, अपने कार्यक्रम के माध्यम से यह नीचे iterating रहता है,
तो यह आप अपने कार्यक्रम के पहले कुछ लाइनों दिखाता हूँ.
तो यह आप अगले कुछ लाइनों, और अगले हिस्सा और अगले हिस्सा दिखाता हूँ.
और यह करने के लिए नीचे जाने की कोशिश करते रहेंगे.
और अब हम "16 नंबर लाइन सीमा से बाहर है." मिलेगा
क्योंकि यह केवल 15 लाइनें है.
यदि आप इस बात पर आते हैं और अपनी सोच, "मैं क्या करूँ?" आप मदद आदेश का उपयोग कर सकते हैं.
मदद करने के लिए और फिर यह एक आदेश के नाम दे प्रयोग करें.
और आप देख GDB हमें सामान के सभी इस तरह देता है.
इसे कहते हैं, "कोई तर्क के साथ, के बाद या आसपास पिछले लिस्टिंग दस अधिक लाइनों की सूची.
सूची के पहले दस लाइनों सूचियों -
तो चलो सूची ऋण का उपयोग करने की कोशिश.
और कहा कि 10 लाइनों पिछले सूची बद्ध करता है, आप के आसपास की सूची के साथ एक छोटा सा खेल सकते हैं.
आप सूची, सूची कर सकते हैं, आप भी सूची एक नंबर दे सकते हैं और 8 सूची की तरह,
और यह 8 रेखा के आसपास 10 लाइनों को सूचीबद्ध करेंगे.
और तुम यहाँ क्या हो रहा है देखने के लिए आप एक और अगर सरल मिल गया है सकते हैं.
यदि आप CS50 चट्टानों में टाइप करते हैं, यह बाहर प्रिंट "आप एक ए मिलता है"
अन्यथा यह बाहर प्रिंट "आप एक डी."
Bummer शहर. सही सभी. हाँ?
>> [डैनियल] तो, जब मैं उद्धरणों के बिना CS50 चट्टानों करने की कोशिश की
यह कहते हैं, "आप एक डी."
मैं उद्धरण की जरूरत के लिए यह काम करने के लिए मिलता है, ऐसा क्यों है?
>> हाँ. यह पता चला है कि जब - यह एक और मजेदार छोटे से tidbit है -
, जब आप प्रोग्राम चलाने के लिए, अगर हम इसे चलाने के लिए और हम CS50 चट्टानों में टाइप
बस की तरह डैनियल कह रहा था वह किया था, और आप हिट दर्ज करें,
यह अभी भी कहते हैं, हम एक डी.
और सवाल है, ऐसा क्यों है?
और यह पता चला है कि हमारे दोनों टर्मिनल और GDB इन दो अलग - अलग तर्क के रूप में व्याकरण के नियमों के अनुसार या व्याकरण सम्मत (शब्द की) व्याख्या करना.
जब वहाँ एक अंतरिक्ष, के रूप में निहित है, क्योंकि
पहले तर्क समाप्त हो गया, अगले तर्क शुरू करने के बारे में है.
उन दो में गठबंधन तरीका है, या माफ करना, एक बहस में,
उद्धरण का उपयोग करने के लिए है.
तो अब, अगर हम यह उद्धरण में डाल दिया है और इसे फिर से चलाने के लिए, हम एक ए
तो बस संक्षिप्त करने के लिए, कोई उद्धरण, CS50 और चट्टानों के रूप में दो अलग - अलग तर्क विश्लेषित कर रहे हैं.
उद्धरण के साथ, यह एक तर्क के रूप में पूरी तरह पार्स है.
>> हम एक breakpoint के साथ देख सकते हैं.
अब तक हम अपने कार्यक्रम चल रहा है, और यह चल रहा है
या तो यह दोष या हिट एक त्रुटि seg तक
या जब तक यह exited और सभी पूरी तरह से ठीक हो गया है.
यह जरूरी सबसे उपयोगी बात नहीं है, क्योंकि कभी कभी
आप अपने प्रोग्राम में एक त्रुटि है, लेकिन यह एक विभाजन गलती नहीं पैदा कर रहा है.
यह अपने कार्यक्रम को रोकने के लिए या ऐसा कुछ नहीं पैदा कर रहा है.
एक खास बिंदु पर थामने के लिए GDB अपने कार्यक्रम के लिए रास्ता
एक breakpoint सेट है.
आप या तो एक समारोह के नाम पर एक breakpoint स्थापित करके यह कर सकता
या आप कोड की एक विशेष लाइन पर एक breakpoint सेट कर सकते हैं.
मैं समारोह के नाम पर breakpoints सेट की तरह है, क्योंकि याद करने के लिए आसान है,
और अगर आप वास्तव में जाने के लिए और एक छोटा सा अपने स्रोत कोड बदलने,
तो अपने breakpoint वास्तव में अपने कोड के भीतर एक ही जगह पर रहना होगा.
जबकि अगर आप पंक्ति संख्या का उपयोग कर रहे हैं, और लाइन नंबर बदलने
क्योंकि आप जोड़ने या कुछ कोड को नष्ट करने के लिए, तो आपके breakpoints पूरी तरह से कर रहे हैं बँधा हुआ.
सबसे आम बातें मैं मुख्य समारोह पर एक ब्रेकपाइंट सेट कर दिया जाता है.
अक्सर मैं GDB बूट हूँ, मैं ख मुख्य लिखें, हिट दर्ज करें, और कि एक breakpoint निर्धारित करेंगे
मुख्य समारोह जो सिर्फ कहते हैं, "कार्यक्रम के रूप में जल्द ही के रूप में आप चल रहा शुरू रोकें",
और कहा कि इस तरह, जब मैं कहता हूँ, साथ CS50 चट्टानों के रूप में अपने कार्यक्रम चलाने के लिए दो तर्कों
और हिट दर्ज करें, यह मुख्य समारोह के लिए हो जाता है और यह सही बहुत पहली पंक्ति में बंद हो जाता है,
सही से पहले यह strcmp समारोह का मूल्यांकन किया जाता है.
>> चूंकि मैं रुका हुआ हूँ, अब मैं आसपास mucking शुरू कर सकते हैं और देख रहा है क्या हो रहा है
सभी विभिन्न चर कि मेरे कार्यक्रम में पारित कर रहे हैं की साथ.
यहाँ मैं बाहर argc मुद्रित करने के लिए कर सकते हैं और देखने के लिए क्या हो रहा है.
देखें कि argc 3 है, क्योंकि यह 3 भिन्न मान मिला है.
यह प्रोग्राम का नाम है, यह पहला तर्क और दूसरा तर्क मिल गया है.
हम उन argv में देख कर बाहर मुद्रित कर सकते हैं [0] argv [1], और argv [2]
तो अब आप भी क्यों इस strcmp कॉल करने के लिए असफल हो रहा है और देख सकते हैं,
क्योंकि आप देखते हैं कि यह दो अलग - अलग तर्क में CS50 चट्टानों विभाजित किया था.
इस बिंदु पर, एक बार आप एक breakpoint मारा है, तो आप अपने कार्यक्रम के माध्यम से कदम जारी रख सकते हैं
लाइन से लाइन, के रूप में अपने कार्यक्रम को फिर से शुरू करने का विरोध किया.
तो अगर आप अपने कार्यक्रम को फिर से और बस शुरू नहीं करना चाहता है यहाँ से जारी रखने के लिए,
आप जारी रखने के आदेश का उपयोग कर सकते हैं और कार्यक्रम को समाप्त करने के लिए चलाने के लिए जारी रहेगा.
बस इसे यहाँ किया.
हालांकि, अगर मैं कार्यक्रम, CS50 चट्टानों को पुनः आरंभ करने के लिए, यह मेरे ब्रेकपाइंट फिर हिट,
और इस बार, अगर मैं सिर्फ कार्यक्रम के बाकी के माध्यम से सभी तरह से जाना नहीं चाहते हो,
मैं अगले आदेश, जो मैं भी n के साथ संक्षिप्त का उपयोग कर सकते हैं.
और इस कार्यक्रम लाइन के माध्यम से लाइन से कदम होगा.
तो आप के रूप में चीजों को निष्पादित करने के लिए घड़ी के रूप में चर परिवर्तन कर सकते हैं, के रूप में बातें अद्यतन मिलता है.
जो बहुत अच्छा है.
अन्य शांत बात के बजाय और अधिक और अधिक से अधिक एक ही कमांड फिर दोहरा है,
अगर तुम सिर्फ हिट दर्ज करें तो यहाँ आप देखने के लिए मैं कुछ भी नहीं टाइप किया है -
अगर मैं सिर्फ हिट दर्ज करें, यह पिछले आदेश दोहराना होगा,
या पिछले GDB आदेश है कि मैं बस के अंदर डाल
मैं दर्ज मार रखने कर सकते हैं और यह मेरे कोड लाइन द्वारा लाइन के माध्यम से कदम रख सकते हैं.
मैं तुम लोगों को बाहर अन्य छोटी गाड़ी कार्यक्रम की जांच के रूप में अच्छी तरह से जाने के लिए प्रोत्साहित करेगा.
हम उनमें से आज अनुभाग में सभी के माध्यम से प्राप्त करने के लिए समय नहीं है.
स्रोत कोड है, तो आप देखते हैं क्या हो रहा है की तरह कर सकते हैं
अगर तुम सच में अटक जाते हैं दृश्यों के पीछे,
लेकिन बहुत कम से कम अभी तक GDB बूटिंग अभ्यास,
कार्यक्रम चल रहा है जब तक आप इसे पर टूटता है,
बैकट्रैस हो रही है, पता लगाना क्या समारोह दुर्घटना में था,
क्या यह लाइन पर था, बाहर कुछ चर मान छपाई,
अभी तो आप इसके लिए एक महसूस हो, कि क्योंकि वास्तव में आप आगे जाने में मदद मिलेगी.
इस बिंदु पर, हम GDB के बाहर छोड़ दिया है, जो तुम छोड़ दिया है का उपयोग कर या बस क्ष करने के लिए जा रहे हैं.
यदि आपके कार्यक्रम अभी भी चल रहा है के बीच में है, और यह नहीं exited है,
यह हमेशा आप से पूछना होगा, "क्या आप सुनिश्चित करें कि आप वास्तव में छोड़ने के लिए चाहते हैं?"
आप सिर्फ हाँ हिट कर सकते हैं.
>> अब हम अगले समस्या है, हम जो बिल्ली कार्यक्रम है को देखने के लिए जा रहे हैं.
यदि आप पुनः निर्देशित कर और पाइप पर कम देखो, तो आप देखेंगे कि टॉमी इस कार्यक्रम का उपयोग करता है
है कि मूल रूप से स्क्रीन के लिए एक फ़ाइल के सभी उत्पादन प्रिंट.
तो अगर मैं बिल्ली चलाते हैं, तो यह वास्तव में एक कार्यक्रम में निर्मित उपकरण को,
और अगर आप एमएसीएस है आप अपने मैक पर यह भी कर सकते हैं, अगर आप टर्मिनल खोलने.
और हम बिल्ली - चलो कहते हैं, cp.c, और हिट दर्ज करें.
यह क्या किया है, अगर हम एक छोटा सा और देखने के लिए जहां हम लाइन भागा,
या जहाँ हम बिल्ली आदेश दौड़ा, यह सचमुच सिर्फ बाहर हमारे स्क्रीन पर मुद्रित की सामग्री cp.c.
हम इसे फिर से चलाने के लिए और कर सकते हैं आप एकाधिक फ़ाइलों में एक साथ रख सकते हैं.
तो आप बिल्ली cp.c करते हैं, और कर सकते हैं तो हम भी cat.c फ़ाइल जोड़ना कर सकते हैं,
जो हम कर रहे हैं के बारे में लिखने के कार्यक्रम है,
और यह दोनों फाइलों को वापस मुद्रित करने के लिए हमारे स्क्रीन पर वापस करेंगे.
तो अगर हम एक छोटा सा, हम देखते हैं कि जब हम इस बिल्ली cp.c, cat.c भागा,
पहली बार इसे सी.पी. फ़ाइल मुद्रित, और फिर, यह नीचे यह बाहर cat.c फ़ाइल मुद्रित सही यहाँ नीचे.
हम इस प्रयोग को सिर्फ हमारे पैरों को गीला करने के लिए जा रहे हैं.
टर्मिनल के लिए सरल मुद्रण के साथ खेलने के आसपास देखने के लिए, यह कैसे काम करता है.
अगर आप लोग जीएडिट cat.c के साथ खुला, हिट दर्ज करें,
आप प्रोग्राम है कि हम लिखने के बारे में कर रहे हैं देख सकते हैं.
हम यह अच्छा बॉयलर प्लेट को शामिल किया है, इसलिए, हम है कि सभी बाहर टाइपिंग के लिए समय बिताने के लिए नहीं है.
हम भी तर्कों की संख्या की जांच अंदर पारित कर दिया
हम बाहर एक अच्छा प्रयोग संदेश मुद्रित.
>> यह बात यह है कि, फिर से, जैसे हम के बारे में बात कर रहा है की तरह है,
यह मांसपेशियों की स्मृति की तरह लगभग है.
बस के लिए सामान की एक ही प्रकार के कर याद रखना
और हमेशा उपयोगी संदेश के कुछ प्रकार के मुद्रण
इतना है कि लोगों को पता है कि कैसे अपने कार्यक्रम चलाने के लिए.
बिल्ली के साथ, यह बहुत आसान है, हम सिर्फ अलग तर्क के सभी के माध्यम से जा रहे हैं
कि हमारे कार्यक्रम के लिए पारित किया गया है, और हम मुद्रण के लिए जा रहे हैं
एक समय में एक स्क्रीन उनके बाहर सामग्री.
आदेश में फ़ाइलों को मुद्रित करने के लिए स्क्रीन से बाहर है, हम बहुत कुछ इसी तरह करने के लिए जा रहे हैं
के लिए हम क्या प्रश्नोत्तरी के अंत में किया था.
प्रश्नोत्तरी, कि कार्यक्रम किराया के अंत में, हम करने के लिए एक फ़ाइल खोलने था,
और फिर हम यह करने के लिए प्रिंट था.
इस मामले में, हम करने के लिए एक फ़ाइल खोलने जा रहे हैं, और हम इसे से बजाय पढ़ने के लिए जा रहे हैं.
फिर हम एक फाइल करने के बजाय प्रिंट लिए जा रहे हैं, हम करने के लिए स्क्रीन पर मुद्रित करने के लिए जा रहे हैं.
तो स्क्रीन आप सभी printf साथ पहले किया मुद्रण.
तो वह भी पागल नहीं है.
लेकिन एक फ़ाइल को पढ़ने में अजीब तरह का है.
हम यह है कि एक छोटा सा के माध्यम से एक समय में जाना होगा.
यदि आप लोगों कि पिछले समस्या के लिए वापस अपने प्रश्नोत्तरी, 33 समस्या पर जाना है,
पहली पंक्ति है कि हम यहाँ क्या करने जा रहे हैं, फ़ाइल खोलने, हम वहाँ क्या किया था के लिए इसी तरह की है.
स्टेला तो, क्या की तरह है, जब हम एक फ़ाइल खोलने कि लाइन दिखती है?
[स्टेला] कैपिटल फ़ाइल *, फ़ाइल - >> ठीक है. >> Fopen के बराबर है. >> हाँ.
इस मामले में कौन सा है? यह टिप्पणी में है.
>> यह टिप्पणी में है? argv [i] और r?
वास्तव में. >> ठीक है. तो स्टेला पूरी तरह से सही है.
यह क्या लाइन की तरह लग रहा है.
हम एक फ़ाइल स्ट्रीम चर प्राप्त करने के लिए, यह एक फ़ाइल * में स्टोर करने के लिए जा रहे हैं, तो सभी टोपियां,
फ़ाइल, *, और इस चर के नाम फाइल किया जाएगा.
हम इसे कहते हैं कि जो कुछ भी हम जैसे हो सकता है. हम यह first_file, या file_i, जो कुछ भी हम चाहते हैं कह सकते हैं.
और फिर फ़ाइल का नाम कमांड लाइन पर इस कार्यक्रम के लिए पारित किया गया था.
तो यह argv में संग्रहित है [i] और फिर हम पढ़ने के मोड में इस फाइल को खोलने जा रहे हैं.
अब है कि हम फ़ाइल को खोल दिया है, क्या बात है कि हम हमेशा के लिए याद है
जब भी हम एक फ़ाइल खोल दिया है? इसे बंद करो.
तो Missy, कैसे हम एक फ़ाइल बंद करते हैं?
[Missy] fclose (फाइल) >> fclose (फ़ाइल). बिल्कुल सही.
बढ़िया है. ठीक है. यदि हम इस पर देखने के लिए टिप्पणी करना ठीक है यहाँ,
इसे कहते हैं, "ओपन argv [i] और stdout के लिए अपनी सामग्री मुद्रित करने के लिए."
>> मानक बाहर एक अजीब नाम है. Stdout सिर्फ इतना कह का हमारा तरीका है
हम यह टर्मिनल मुद्रित करना चाहते हैं, हम यह मानक निर्गम धारा मुद्रित करना चाहते हैं.
हम वास्तव में इस टिप्पणी से छुटकारा मिल सकता है यहाँ.
मैं इसे कॉपी और पेस्ट के बाद से है कि हम क्या किया है के लिए जा रहा हूँ.
इस बिंदु पर, अब हम बिट द्वारा फ़ाइल थोड़ा पढ़ा है.
हम पढ़ने फ़ाइलों के तरीके के एक जोड़े पर चर्चा की है.
जो लोगों को अपने पसंदीदा अब तक कर रहे हैं?
तरीके जो आप या देखा है क्या तुम्हें याद है, फ़ाइलों को पढ़ने?
[डैनियल] fread? Fread? >> Fread तो एक है. जिमी, तो आप किसी भी अन्य लोगों को जानते हो?
[जिमी] नहीं >> ठीक है. नहीं. Charlotte? अलेक्जेंडर? किसी भी दूसरों? ठीक है.
तो अन्य लोगों fgetc हैं, एक है कि हम एक बहुत इस्तेमाल करेंगे है.
वहाँ भी fscanf, तुम लोगों को एक पैटर्न यहाँ देखें?
वे सब च के साथ शुरू करते हैं. एक फ़ाइल के साथ क्या करने के लिए कुछ भी.
वहाँ fread है, fgetc, fscanf. ये पढ़ने के कार्यों के सभी कर रहे हैं.
हम fwrite है लेखन के लिए, हम fgetc के बजाय fputc है.
हम भी fprintf की तरह हम प्रश्नोत्तरी पर देखा.
चूंकि यह एक समस्या यह है कि एक फ़ाइल से पढ़ने शामिल है,
हम इन तीन कार्यों में से एक का उपयोग करने के लिए जा रहे हैं.
हम यहाँ नीचे इन कार्यों का उपयोग करने के लिए नहीं जा रहे हैं.
इन कार्यों के सभी मानक पुस्तकालय मैं / हे में पाए जाते हैं.
तो अगर आप इस कार्यक्रम के शीर्ष पर देखो,
आप देख सकते हैं कि हम पहले से ही मानक पुस्तकालय मैं / ओ के लिए हेडर फाइल शामिल है.
यदि हम यह पता लगाने चाहते हैं जो हम एक का उपयोग करना चाहते हैं,
हम हमेशा मैन पेज खोल सकते हैं.
तो हम आदमी stdio टाइप कर सकते हैं
और stdio और सी में इनपुट, आउटपुट कार्य के बारे में पढ़ा
और हम पहले से ही देख ओह देखो, कर सकते हैं. यह fgetc उल्लेख है, यह fputc उल्लेख है.
तो आप नीचे एक छोटा सा ड्रिल कर सकते हैं और को देखो, कहते हैं, fgetc
और इसके मैन पेज को देखो.
आप देख सकते हैं कि यह अन्य कार्यों की एक पूरी गुच्छा के साथ चला जाता है:
fgetc, fgets, जीइ टीसी, getchar हो जाता है, ungetc, और वर्ण और तार के अपने इनपुट.
तो यह है कि हम मानक इनपुट से फाइलों से अक्षर और तार में पढ़ा,
जो उपयोगकर्ता से अनिवार्य रूप से है.
और यह है कि हम इसे वास्तविक सी में
तो यह GetString और getchar कार्यों का उपयोग नहीं कर रहा है
कि हम CS50 पुस्तकालय से इस्तेमाल किया.
हम तरीके के एक जोड़े में इस समस्या को करने जा रहे हैं
इतनी है कि आप इसे करने के दो अलग अलग तरीकों से देख सकते हैं.
दोनों fread समारोह कि डैनियल उल्लेख किया और fgetc अच्छे तरीके से ऐसा कर रहे हैं.
मुझे लगता है कि fgetc थोड़ा आसान है, क्योंकि यह ही है, जैसा कि आप देख,
एक तर्क है, फ़ाइल * कि हम चरित्र से पढ़ने की कोशिश कर रहे हैं,
और अपनी वापसी के मूल्य एक int है.
और यह एक छोटे से भ्रामक है, सही है?
>> क्योंकि हम एक चरित्र हो रही है, तो क्यों इस वापसी चार नहीं करता है?
तुम लोग क्यों यह एक चार वापस नहीं हो सकता है पर कोई विचार है?
[Missy जवाब, unintelligible] >> हाँ. तो Missy पूरी तरह से सही है.
यदि यह ASCII है, तो इस पूर्णांक एक वास्तविक चार को मैप किया जा सकता है.
एक ASCII वर्ण हो सकता है, और यह सही है.
यह वास्तव में क्या हो रहा है.
हम एक int का उपयोग कर रहे हैं बस, क्योंकि यह अधिक बिट्स है.
यह एक चार से भी बड़ा है, हमारे चार केवल 8 बिट है कि हमारे 32 बिट मशीनों पर 1 बाइट.
और एक int सभी 4 बाइट्स 'अंतरिक्ष के लायक है.
और यह पता चला है कि जिस तरह से fgetc काम करता है,
, अगर हम अपने सार में इस आदमी को एक छोटा सा पृष्ठ में नीचे स्क्रॉल
सभी तरह से नीचे स्क्रॉल. यह पता चला है कि वे इस विशेष EOF बुलाया मूल्य का उपयोग करें.
यह fgetc समारोह की वापसी मूल्य के रूप में एक विशेष निरंतर
जब भी आप फ़ाइल के अंत हिट या अगर आपको कोई त्रुटि मिलती.
और यह पता चला है कि EOF साथ इन तुलना करने के लिए ठीक है,
आप एक int में जानकारी की है कि अतिरिक्त राशि है कि आप चाहते हैं
के रूप में एक चार चर का उपयोग करने का विरोध किया.
हालांकि fgetc प्रभावी रूप से एक फ़ाइल से एक चरित्र हो रही है,
आप को याद है कि यह कुछ है कि int प्रकार आप के लिए है लौट रहा है चाहते हैं.
उस ने कहा, यह काफी का उपयोग करने के लिए आसान है.
यह हमें एक चरित्र देने के लिए जा रहा है, तो हम सभी को करना है फ़ाइल पूछते रहते हैं,
"मुझे अगले चरित्र दे दो, मुझे अगले चरित्र दे, मुझे अगले चरित्र दे,
जब तक हम फ़ाइल का अंत करने के लिए मिलता है.
और कहा कि हमारे फ़ाइल से एक समय में एक चरित्र में खींच जाएगा,
और फिर हम क्या कर सकते हैं जो कुछ भी हम इसके साथ पसंद है.
हम इसे स्टोर कर सकते हैं, हम इसे एक स्ट्रिंग के लिए जोड़ने के लिए, हम इसे बाहर प्रिंट कर सकते हैं कर सकते हैं.
कि किसी भी मत करो.
>> वापस Zooming बाहर और हमारे cat.c कार्यक्रम के लिए वापस जा रहा,
अगर हम fgetc का उपयोग करने के लिए जा रहे हैं,
हम कैसे कोड के इस अगली पंक्ति दृष्टिकोण हो सकता है?
हम प्रयोग करने जा रहे हैं - fread कुछ अलग करना होगा.
और इस समय हम सिर्फ fgetc का उपयोग करने के लिए एक समय में एक चरित्र पाने के लिए जा रहे हैं.
एक पूरे फ़ाइल प्रक्रिया है, हम क्या करने के लिए क्या हो सकता है?
कितने वर्ण एक फ़ाइल में हैं?
वहाँ एक बहुत कुछ कर रहे हैं. तो आप शायद एक पाने के लिए करना चाहते हैं
और फिर एक और पाने के लिए और एक और पाने के लिए और एक अन्य मिल.
एल्गोरिथ्म की तरह तुम्हें क्या लगता है हम यहाँ का उपयोग करने के लिए हो सकता है?
किस तरह का है? [अलेक्जेंडर] एक पाश के लिए? वास्तव में. >>
लूप के कुछ प्रकार.
पाश के लिए इस मामले में वास्तव में महान है.
और तुम कह रहे थे की तरह, यह लगता है जैसे आप पूरे फ़ाइल पर एक पाश चाहते,
एक समय में एक चरित्र हो रही है.
क्या पर कोई सुझाव है कि तरह लग सकता है?
[अलेक्जेंडर, unintelligible]
>> ठीक है, मुझे अंग्रेजी में बताओ कि तुम क्या करने की कोशिश कर रहे हैं? [अलेक्जेंडर, unintelligible]
तो इस मामले में, ऐसा लगता है जैसे हम सिर्फ पूरे फ़ाइल पर पाश करने के लिए कोशिश कर रहे हैं.
[अलेक्जेंडर] तो मैं > का आकार -?
मैं फाइल के आकार को सही लगता है? आकार - we'll बस इसे इस तरह से लिख.
फ़ाइल के समय के लिए आकार में किया जा रहा है, मैं + +.
तो यह पता चला है कि जिस तरह से आप इस fgetc का उपयोग करते हैं, और यह नया है,
यह है कि वहाँ कोई आसान करने के लिए सिर्फ एक फ़ाइल के आकार पाने के लिए रास्ता है
निर्माण कि आप पहले देखा है के इस "sizeof" प्रकार के साथ.
जब हम उस fgetc समारोह का उपयोग करें, हम किसी तरह की शुरू कर रहे हैं
नया, पाश के लिए इस कायरता वाक्यविन्यास, जहां सिर्फ एक बुनियादी काउंटर का उपयोग करने के बजाय
चरित्र द्वारा चरित्र जाना है, हम एक समय में एक चरित्र खींचने के लिए जा रहे हैं,
एक समय में एक चरित्र है, और जिस तरह से हम जानते हैं कि हम अंत में कर रहे हैं
है जब हम अक्षरों की एक निश्चित संख्या में नहीं गिना है,
लेकिन जब हम चरित्र बाहर खींच फ़ाइल चरित्र की है कि विशेष अंत है.
इसलिए हम इस से कर सकते हैं - मैं इस चर्चा कहते हैं, और हम यह इनिशियलाइज़ करने के लिए जा रहे हैं
हमारी पहली फ़ाइल से बाहर 1 चरित्र मिलता है कॉल के साथ.
यह सही यहाँ हिस्सा तो, इस फ़ाइल का एक चरित्र बाहर ले जा रहा है
और यह चर चर्चा में स्टोर.
हम यह कर रखने के लिए जा रहे हैं जब तक हम फाइल के अंत करने के लिए,
जो हम चरित्र के लिए परीक्षण किया जा रहा है कि विशेष EOF चरित्र के बराबर नहीं है.
और फिर चर्चा कर के बजाय + +, जो बस मान वेतन वृद्धि चाहते हैं,
यदि ऐसा है तो हम फ़ाइल की एक बाहर है, एक राजधानी कहते हैं, पढ़ा,
चर्चा + + हमें दे ख होगा, और फिर हम ग और फिर घ मिलता था.
यह स्पष्ट रूप से नहीं है कि हम क्या चाहते हैं. यहाँ हम क्या चाहते हैं
इस अंतिम बिट में हम फ़ाइल से अगले वर्ण प्राप्त करना चाहते है.
>> तो हम कैसे फ़ाइल से अगले चरित्र हो सकता है?
हम कैसे फ़ाइल से 1 चरित्र मिलता है?
[छात्र] fgetfile? Fgetc >>, या, माफ करना, तो आप पूरी तरह से सही थे.
मैं इसे सही वहाँ गलत वर्तनी. तो हाँ.
यहाँ चर्चा कर के बजाय + +,
हम सिर्फ fgetc (फ़ाइल) फिर से फोन करने के लिए जा रहे हैं
और हमारे एक ही चर्चा चर में परिणाम की दुकान.
[छात्र सवाल है, unintelligible]
>> यह है कि जहां इन फ़ाइल * लोग विशेष कर रहे हैं.
जिस तरह से वे काम करते हैं वे है - जब आप पहली बार खुला जब आप पहली बार है कि fopen कॉल करते हैं,
फ़ाइल * प्रभावी रूप से फ़ाइल की शुरुआत करने के लिए एक संकेत के रूप में कार्य करता है.
और फिर हर बार जब आप fgetc कॉल, यह फाइल के माध्यम से एक चरित्र चाल.
तो जब भी आप यह कहते हैं, आप एक चरित्र से फ़ाइल सूचक incrementing रहे हैं.
और जब आप फिर fgetc, आप इसे एक और चरित्र आगे बढ़ रहे हैं
और एक अन्य चरित्र और दूसरे चरित्र और एक अन्य चरित्र.
[छात्र सवाल है, unintelligible] >> और that's - हाँ.
यह हुड के तहत यह जादू की तरह है.
आप बस के माध्यम से incrementing रखने.
इस बिंदु पर, आप के लिए वास्तव में एक चरित्र के साथ काम करने में सक्षम हो.
तो कैसे हम स्क्रीन करने के लिए इस बाहर प्रिंट सकता है अब?
हम printf एक ही बात है कि हम पहले प्रयोग किया जाता का उपयोग कर सकते हैं.
कि हम सभी सेमेस्टर का उपयोग किया गया.
हम printf कॉल कर सकते हैं,
और हम ऐसे ही चरित्र में पारित कर सकते हैं.
Printf का उपयोग कर और इस प्रारूप स्ट्रिंग होने के बजाय एक और तरीका यह करना है,
हम भी एक अन्य कार्यों का उपयोग कर सकते हैं.
हम fputc, जो स्क्रीन के एक चरित्र प्रिंट का उपयोग कर सकते हैं,
अलावा अगर हम fputc को देखो - मुझे बाहर एक छोटा सा ज़ूम.
हम देखते हैं कि क्या अच्छा है यह चरित्र में लेता है कि हम बाहर पढ़ने के fgetc का उपयोग कर,
लेकिन फिर हम इसे एक मुद्रित करने के लिए धारा दे है.
हम भी putchar समारोह का उपयोग कर सकते हैं, जो सीधे मानक बाहर रखा जाएगा.
तो वहाँ विभिन्न विकल्प है कि हम मुद्रण के लिए उपयोग कर सकते हैं की एक पूरी गुच्छा हैं.
वे मानक पुस्तकालय मैं / हे में सभी कर रहे हैं.
जब भी आप मुद्रित करना चाहते हैं - तो printf डिफ़ॉल्ट रूप से, धारा बाहर विशेष मानक के लिए मुद्रित होगा,
जो कि stdout है.
तो हम सिर्फ इस जादू मान, यहाँ stdout की तरह के रूप में यह उल्लेख कर सकते हैं.
उफ़! सेमीकोलन बाहर रखो.
>> यह नया, यहाँ में कायरता जानकारी का एक बहुत कुछ है.
यह एक बहुत बहुत मुहावरेदार इस अर्थ में है कि इस कोड है,
कि इस तरह से लिखा है बस, क्योंकि यह साफ है पढ़ने के लिए, पढ़ने के लिए आसान है.
वहाँ कई अलग अलग तरीके से ऐसा कर, कई विभिन्न कार्यों को आप उपयोग कर सकते हैं,
लेकिन हम सिर्फ अधिक से अधिक है और ये एक ही पैटर्न का पालन करते हैं.
तो अगर आप को फिर से आ रहा है और फिर से इस तरह कोड देख आश्चर्य नहीं करना चाहिए.
सही सभी. इस बिंदु पर, हम दिन के लिए तोड़ने की जरूरत है.
आने के लिए धन्यवाद. देख अगर आप ऑनलाइन कर रहे हैं के लिए धन्यवाद. और हम अगले सप्ताह आप देखेंगे.
[CS50.TV]