[Powered by Google Translate] [القسم 5: أقل راحة]
[نيت Hardison، جامعة هارفارد]
[هذا CS50.] [CS50.TV]
نرحب مرة أخرى حتى، رجال.
مرحبا بكم في القسم 5.
في هذه المرحلة، بعد أن استكملت مسابقة 0 وبعد أن شهدت كيف قمت به،
نأمل أن أشعر أنني بحالة جيدة حقا لأن لقد تأثرت كثيرا من النقاط في هذا القسم.
للمشاهدين عبر الإنترنت، لدينا بضعة أسئلة
حول المشاكل الماضيين على مجموعة مشكلة - أو على مسابقة، إلى حد ما.
لذلك نحن في طريقنا للذهاب بسرعة على هذه الحقيقة حتى أن الجميع يرى ما حدث
وكيف أن يذهب من خلال الحل الفعلي بدلا من النظر فقط الحل نفسه.
ونحن في طريقنا للذهاب خلال العقدين الماضيين من المشاكل بسرعة حقا و 32 و 33.
فقط، مرة أخرى، بحيث يمكن للمشاهدين عبر الإنترنت شاهد.
>> إذا كنت أنتقل إلى مشكلتك 32، والذي هو في صفحة 13،
13 من 16، 32 هو المشكلة كل شيء عن التبادل.
كان كل شيء عن مبادلة اثنين من الأعداد الصحيحة.
انها المشكلة التي نحن قد ذهب أكثر من بضع مرات في المحاضرة.
وهنا، ما كنا يطلب منك القيام به هو عملية تتبع الذاكرة سريع.
لملء في قيم المتغيرات كما هي على المكدس
كما رمز يمر عبر هذه الوظيفة المبادلة.
على وجه الخصوص، ما نحن نبحث في - أنا ذاهب لوضع هذه أسفل باد -
على وجه الخصوص، ما نحن نبحث في هذا الخط هو مرقمة 6 الحق هنا.
وانها مرقمة من 6 لتواصل فقط مع المشكلة السابقة.
ما نريد القيام به هو عرض أو علامة للدولة من الذاكرة
كما هو في الوقت الذي نقوم بتنفيذ هذا رقم السطر 6،
التي هي بالفعل العودة من وظيفة مبادلة لدينا هنا.
إذا كان لنا أن انتقل لأسفل هنا، رأينا أن قدمت عناوين من كل شيء في الذاكرة بالنسبة لنا.
هذا هو المفتاح للغاية، ونحن سوف نعود إليه في لحظة واحدة.
ثم إلى هنا في الأسفل، كان لدينا مخطط الذاكرة الصغيرة التي نحن في طريقنا للإشارة إلى.
وقد فعلت فعلا من ذلك على باد الخاص بي.
لذلك أنا ذاهب إلى البديل ذهابا وإيابا بين آي باد ورمز هذا فقط للرجوع اليها.
>> دعونا نبدأ. أولا، دعونا نركز على أول زوجين من الخطوط الرئيسية من هنا.
للبدء، ونحن في طريقنا لتهيئة X و y إلى 1 إلى 2.
لذلك لدينا متغيرين عدد صحيح، وانهم على حد سواء سوف توضع على المكدس.
ونحن في طريقنا لوضع 1 و 2 من فيها.
حتى لو كنت على الوجه لباد بلدي، ونأمل، دعونا نرى -
آبل النسخ المتطابق، ونحن نذهب إلى هناك. حسنا.
حتى لو كنت على الوجه لباد بلدي،
أريد أن تهيئة X و y إلى 1 إلى 2.
ونحن نفعل ذلك بكل بساطة عن طريق كتابة 1 في المربع وضع علامة X
ويمثل 2 في المربع ذ. بسيطة إلى حد ما.
حتى الآن دعونا نعود إلى الكمبيوتر المحمول، ونرى ما سيحدث بعد ذلك.
لذلك هذا هو السطر التالي حيث تصبح الأمور صعبة.
نحن نمر عنوان x و Y عنوان كمعلمات أ و ب إلى وظيفة المبادلة.
عنوان x و Y عنوان هي الأشياء التي لا يمكننا حساب
دون الإشارة إلى هذه الرصاصة يشير صولا هنا.
ولحسن الحظ، أول اثنين من النقاط يقول لنا بالضبط ما هي الأجوبة.
عنوان X في الذاكرة هو 10، وعنوان Y في الذاكرة هو 14.
حتى تلك هي القيم التي مرت في الحصول على وأ و ب في وظيفة أعلى حتى مبادلة لدينا.
ذلك مرة أخرى، والتحول مرة أخرى إلى الرسم البياني لدينا، ويمكنني أن اكتب 10 في
وب 14 في.
الآن، وهذا هو وضعنا نقطة المضي قدما في المبادلة.
التقليب حتى عودة إلى كمبيوتر محمول جديد،
ونحن نرى أن الطريقة التي تعمل مبادلة هو أنني لأول مرة إلغاء مرجعية وتخزين النتيجة في TMP.
وبالتالي فإن المشغل إلغاء مرجعية يقول: "يا. علاج محتويات متغير كعنوان.
انتقل إلى كل ما هو مخزن في هذا العنوان، وتحميله ".
ما قمت بتحميل من متغير يجري ليتم تخزينها في متغير TMP لدينا.
عودة إلى التقليب باد.
إذا ذهبنا إلى العنوان 10، ونحن نعلم أن 10 هو عنوان X varible
لأن قيل لنا من قبل النقطة التي لدينا عنوان في الذاكرة X هو 10.
حتى نتمكن من الذهاب إلى هناك، والحصول على قيمة، والذي هو 1، كما نرى في باد لدينا،
وذلك في تحميل TMP.
مرة أخرى، هذه ليست محتويات النهائي.
ونحن في طريقنا إلى المشي من خلال ونحن سنصل إلى دولتنا النهائي للبرنامج في نهاية المطاف.
ولكن في الوقت الراهن، لدينا القيمة 1 المخزنة في TMP.
>> وهناك سؤال سريع أكثر من هنا.
[ألكسندر] هي المشغل إلغاء مرجعية - هذا مجرد حق نجمة أمام المتغير؟
نعم >>. وبالتالي فإن المشغل إلغاء مرجعية، ونحن نقف إلى كمبيوتر محمول لدينا مرة أخرى،
هو هذا النجم الحق في الجبهة.
وبهذا المعنى، فإنه - كنت على النقيض مع المشغل الضرب
الأمر الذي يتطلب أمرين، وإلغاء مرجعية المشغل هو مشغل أحادي.
تطبيق لقيمة واحدة فقط بدلا من مشغل ثنائي،
حيث تقوم بتطبيقها على قيمتين مختلفة.
بحيث ما يحدث في هذا الخط.
حملنا القيمة 1 وتخزينها في متغير عدد صحيح لدينا مؤقتة.
السطر التالي، نقوم بتخزين محتويات ب إلى -
أو، بدلا من ذلك، نقوم بتخزين المحتويات التي يتم الإشارة إلى ب في المكان الذي يتم الإشارة إلى.
إذا حللنا هذا من اليمين إلى اليسار، ونحن نذهب إلى إلغاء مرجعية ب،
نحن نذهب لمعالجة 14، ونحن نذهب للاستيلاء على عدد صحيح هو هناك،
ومن ثم نحن في سبيلنا للذهاب إلى عنوان 10،
ونحن نذهب لرمي نتيجة لإلغاء مرجعية لدينا في هذه المساحة ب.
التقليب مرة أخرى إلى آي باد لدينا، حيث أننا يمكن أن تجعل هذا قليلا أكثر واقعية،
قد يساعد إذا أنا أكتب الأرقام على كافة العناوين هنا.
لذلك نعرف ان في ذ، ونحن في العنوان 14، x هو في العنوان 10.
عندما نبدأ في B، ونحن ب إلغاء مرجعية، ونحن في طريقنا للاستيلاء على القيمة 2.
نحن نذهب للاستيلاء على هذه القيمة لأن ذلك هو القيمة التي يعيش في العنوان 14.
ونحن في طريقنا لوضعها موضع المتغير الذي يعيش في العنوان 10،
وهو هناك حق، المقابلة لدينا X متغير.
حتى نتمكن من القيام قليلا من الكتابة هنا
حيث نتخلص من 1 لدينا وبدلا من ذلك نكتب (أ) 2.
لذلك كل من حسن وجيد في العالم، على الرغم من أننا قمت X الكتابة الآن.
نحن بتخزينها قيمة x القديمة في متغير TMP لدينا.
حتى نتمكن من إكمال مبادلة مع السطر التالي.
التقليب مرة أخرى إلى جهاز الكمبيوتر المحمول لدينا.
الآن كل ما تبقى هو أن تأخذ محتويات متغير من لدينا عدد صحيح المؤقتة
وتخزينها في المتغير الذي يعيش في العنوان الذي تحتجز ب.
لذلك نحن ذاهبون الى إلغاء مرجعية ب فعال للوصول إلى المتغير
وهذا هو في العنوان الذي يحمل فيه ب،
ونحن في طريقنا الى الاشياء القيمة التي TMP تحتجز فيه.
عودة إلى التقليب باد مرة أخرى.
هل يمكنني مسح هذه القيمة هنا، 2،
وبدلا من ذلك سنقوم نسخ الحق 1 في ذلك.
ثم السطر التالي الذي ينفذ، وبطبيعة الحال -
إذا كان لنا أن نقف مرة أخرى إلى الكمبيوتر المحمول - هو هذا 6 نقاط،
وهو النقطة التي كنا نريد أن يكون لدينا مخطط شغل بالكامل.
التقليب حتى عودة إلى باد مرة أخرى، فقط حتى تستطيع أن ترى في الرسم البياني الانتهاء،
يمكنك أن ترى أن لدينا 10 في، 14 في ب، 1 في TMP، وهي 2 في العاشر، و1 في ذ.
هل هناك أي أسئلة حول هذا؟
هل هذا أكثر منطقية، بعد أن مشى من خلال ذلك؟
جعل من المنطق؟ نأمل أن لا. حسنا.
>> مؤشرات هي موضوع صعب للغاية.
واحد من اللاعبين ونحن نعمل مع القول لديه شائعة جدا:
"لفهم المؤشرات، يجب أولا أن نفهم المؤشرات."
وهو ما أعتقد أنه صحيح جدا. الأمر يستغرق بعض الوقت لتعتاد على ذلك.
الرسم الكثير من الصور، القرعة من المخططات مثل هذه الذاكرة هي مفيدة جدا،
وبعد المشي من خلال مثالا تلو بعد سبيل المثال،
وأنها سوف تبدأ في معنى أكثر من ذلك بقليل والشعور أكثر من ذلك بقليل والشعور أكثر من ذلك بقليل.
وأخيرا، يوم واحد، سيكون لديك كل شيء يتقن تماما.
أي سؤال قبل أن ننتقل إلى مشكلة في المرة القادمة؟ حسنا.
الوجه حتى عودة إلى كمبيوتر محمول.
المشكلة القادمة لدينا هو المشكلة رقم 33 بشأن الملف I / O.
التكبير في هذا قليلا قليلا.
مشكلة 33 - نعم؟
>> [دانيال] كان لي مجرد سؤال سريع. هذا النجم، أو النجمة و،
انه دعا يعتبر إلغاء مرجعية عند استخدام علامة نجمية قبل.
ما كل شيء يسمى عند استخدام العطف من قبل؟
والعطف >> معروض على عنوان من المشغل.
لذلك دعونا انتقل احتياطي.
عفوا. أنا في وضع التكبير حتى لا استطيع ان انتقل حقا.
إذا نظرنا إلى هذا الرمز بسرعة حقا هنا،
مرة أخرى، الشيء نفسه يحدث.
إذا نظرنا إلى هذا الرمز هنا، على هذا الخط حيث يمكننا أن نجعل من الدعوة إلى مبادلة،
ويقول العلامة فقط "الحصول على عنوان في حياة التي المتغير x."
عندما المترجم الخاص بك يجمع التعليمات البرمجية،
في الواقع أنه لا علامة جسديا من مكان في الذاكرة لجميع المتغيرات الخاصة بك للعيش.
وذلك ما يمكن القيام به المترجم ثم بمجرد أن جمعت كل شيء،
من يدري، "أوه، أنا وضعت في عنوان X 10. أضع Y في العنوان 14."
يمكن أن تملأ هذه القيم ثم في لك.
بحيث يمكنك بعد ذلك - فإنه يمكن أن تمر ثم تمرير ذلك في و& Y في كذلك.
هؤلاء الرجال الحصول على عنوان، لكنها أيضا، عند تمريرها إلى الدالة المبادلة
هذه المعلومات النوع، هذا الباحث * هنا، يقول المترجم،
"حسنا، نحن ذاهبون إلى أن تفسير هذا العنوان كعنوان لمتغير عدد صحيح."
كعنوان لكثافة العمليات، والتي تختلف من عنوان متغير حرف
لأن الباحث يستغرق، على جهاز 32 بت، يستغرق 4 بايت من المساحة،
في حين أن الطابع يستغرق سوى بنسبة 1 بايت من المساحة.
لذلك فمن المهم أن نعرف أيضا ما هو - ما يعيش، ما هو نوع من القيمة
يعيش في العنوان الذي حصلت تمريره.
أو العنوان الذي كنت تتعامل معها.
بهذه الطريقة، يمكنك معرفة عدد بايت من المعلومات لتحميل فعلا من ذاكرة الوصول العشوائي الخاصة بك.
ومن ثم، نعم، وهذا المشغل إلغاء مرجعية، مثلك يسأل،
ويذهب إلى معلومات في عنوان معين.
لذلك يقول: مع هذا المتغير هنا، وعلاج محتويات كعنوان،
يذهب إلى هذا العنوان، وسحب، تحميل إلى المعالج، تحميل إلى سجل
القيم الفعلية أو محتويات التي تعيش في هذا العنوان.
أي أسئلة أخرى؟ هذه هي الأسئلة الجيدة.
انها الكثير من المصطلحات الجديدة أيضا.
كما انها نوع من غير تقليدي، ورؤية و* وفي أماكن مختلفة.
>> حسنا.
عودة إلى مشكلة حتى 33، ملف I / O.
وكان هذا واحد من تلك المشاكل التي أعتقد بضعة أشياء حدث.
واحد، هو موضوع جديد إلى حد ما.
قدم اليها في وقت قريب جدا قبل هذه المسابقة،
ومن ثم أعتقد أنه كان نوع من مثل واحدة من تلك المسائل الكلامية في الرياضيات
حيث أنها تعطيك الكثير من المعلومات، ولكن كنت في الواقع لا ينتهي الحاجة إلى استخدام للطن منه.
الجزء الأول من هذه المشكلة واصفا ما ملف CSV هو.
الآن، ملف CSV، وفقا لوصف، هو ملف قيم مفصولة بفواصل.
السبب هذه هي مثيرة للاهتمام على الإطلاق، والسبب كنت تستخدم أي وقت مضى لهم،
و، لأنه، واستخدمت كم كنت من أي وقت مضى الاشياء مثل إكسل؟
الشخصية الأكثر منكم، على الأرجح، أو سوف تستخدم في مرحلة ما من حياتك.
عليك استخدام شيء مثل Excel.
من أجل الحصول على البيانات من جدول بيانات Excel أو القيام بأي نوع من تجهيز معها،
إذا أردت كتابة برنامج C أو Python البرنامج، برنامج جافا،
للتعامل مع البيانات التي قمت بتخزينها في هناك،
واحدة من الطرق الأكثر شيوعا ليخرجه في ملف CSV.
ويمكنك فتح Excel وعندما تذهب إلى 'حفظ باسم' الحوار،
يمكنك الحصول على ملف CSV من الفعلية.
>> مفيد لمعرفة كيفية التعامل مع هذه الأمور.
الطريقة التي يعمل هو أنه مماثل ل- أعني، انها محاكاة أساسا جدول بيانات،
حيث، كما نرى هنا، في قطعة جدا أقصى اليسار،
لدينا كل الأسماء الأخيرة.
لذلك لدينا مالان، ثم Hardison، ثم بودين، MacWilliam، ثم تشان.
جميع الأسماء الأخيرة. ثم فاصلة تفصل بين الأسماء الأخيرة من الأسماء الأولى.
ديفيد، نيت، روب، تومي، وZamyla.
I خلط دائما روبي وتوم.
ومن ثم، أخيرا، العمود الثالث هو عناوين البريد الالكتروني.
بمجرد فهم ذلك، فإن بقية البرنامج هو اضحة إلى حد ما لتنفيذها.
ما فعلناه من أجل تقليد هذه البنية نفسها في برنامج C لدينا
ولقد استخدمنا هيكل.
سوف نبدأ اللعب مع هذه أكثر قليلا أيضا.
رأينا منهم لبت القليل الأولى في مجموعة المشكلة 3، عندما كنا نتعامل مع القواميس.
ولكن هذا البنية الموظفين بتخزين اسم العائلة، الاسم الأول، وبريد إلكتروني.
وتماما مثل ملف CSV لدينا تخزين.
لذلك هذا هو تحويل للتو من شكل الى آخر.
لدينا لتحويل، في هذه الحالة، البنية الموظفين في الخط،
خط مفصولة بفواصل، تماما مثل ذلك.
هل هذا معقول؟ كنت قد اتخذت جميع اللاعبين هذه المسابقة،
لذلك أتصور لديك على الأقل لديه بعض الوقت للتفكير في ذلك.
>> في وظيفة تأجير، مشكلة يطلب منا أن تأخذ في - التكبير في we'll على هذا قليلا قليلا -
تأخذ في بنية الموظفين، والبنية الموظفين، مع اسم ثانية،
وإلحاق محتوياته إلى ملف staff.csv لدينا.
كما تبين أن هذا هو اضحة إلى حد ما للاستخدام.
سنقوم النوع من اللعب حولها مع هذه الوظائف أكثر قليلا اليوم.
لكن في هذه الحالة، فإن وظيفة fprintf هو حقا المفتاح.
حتى مع fprintf، يمكننا طباعة، مثلك تماما الرجال قد تم استخدام هذا المصطلح printf كله.
يمكنك printf خط إلى ملف.
وذلك بدلا من مجرد جعل الدعوة المعتادة printf حيث تعطيه سلسلة التنسيق
ثم استبدال كافة المتغيرات مع الوسائط التالية،
مع fprintf، حجتك الأولى بدلا من ذلك هو الملف الذي تريد الكتابة إلى.
إذا كان لنا أن ننظر إلى هذا الأمر في الأجهزة، على سبيل المثال، رجل fprintf،
يمكننا أن نرى الفرق بين printf وfprintf.
أنا هنا في تكبير قليلا.
حتى مع printf، الذي يطلق عليها سلسلة تنسيق، ثم الحجج لاحقة
كلها متغيرات لاستبدال أو استبدال في سلسلة التنسيق لدينا.
في حين مع fprintf، فإن الحجة الأولى هي في الواقع هذه * ملف يسمى تيار.
>> في العودة إلى هنا لتوظيف لدينا،
لدينا بالفعل لدينا تيار * ملف مفتوح بالنسبة لنا.
هذا ما يفعل هذا السطر الأول، بل يفتح الملف staff.csv،
فإنه يفتح في وضع إلحاق، وهي كل ما تبقى لنا للقيام
كتابة هيكل الموظفين إلى الملف.
و، دعونا نرى، هل تريد استخدام جهاز آي باد؟
سوف تستخدم جهاز آي باد. لدينا الفراغ - دعونا نضع هذا على الطاولة حتى أتمكن من كتابة أفضل قليلا -
إفراغ تأجير ويستغرق في وسيطة واحدة، وهيكل الموظفين دعا ق.
حصلت الأقواس لدينا، لدينا لدينا * ملف يسمى ملف،
لدينا لدينا خط الدالة fopen التي توافرت لدينا،
وأنا أكتب فقط كنقاط لأنه بالفعل في موسوعة.
وبعد ذلك لدينا خط المقبلة، ونحن في طريقنا لإجراء مكالمة إلى fprintf
ونحن في طريقنا لتمرير في الملف الذي نريد الطباعة إلى،
ثم لدينا سلسلة التنسيق، والتي -
سادعك الرجال تقول لي ما يبدو.
كيف عنك، ستيلا؟ هل تعرف ما الجزء الأول من سلسلة التنسيق يشبه؟
[ستيلا] لست متأكدا. >> لا تتردد في طرح جيمي.
هل تعرف، جيمي؟
[جيمي] هل من الماضي؟ لا أعرف. لست متأكدا تماما.
حسنا >>. ماذا عن، لم تحصل أي شخص هذا صحيح في الامتحان؟
رقم حسنا.
اتضح أن كل ما لدينا هنا القيام به هو أننا نريد كل جزء من هيكل موظفينا
التي سيتم طباعتها من كسلسلة في ملف لدينا.
نحن فقط استخدام حرف استبدال سلسلة ثلاث مرات مختلفة لأن لدينا اسم العائلة
تليها فاصلة، ثم الاسم الأول ثم بفاصلة،
ثم أخيرا ويتبع عنوان البريد الإلكتروني الذي - التي ليست
تركيب على الشاشة - ولكن جاء بعد ذلك بواسطة حرف السطر الجديد.
لذلك أنا ذاهب لأنه يكتب فقط الى هناك.
وبعد سلسلة لدينا ثم تنسيق،
لدينا فقط بدائل، وهو ما وصول باستخدام نقطة تدوين
أن رأينا في مجموعة مكونة المشكلة 3.
يمكننا استخدام s.last، s.first، وs.email
لتحل محل تلك القيم في الثلاثة في سلسلة التنسيق لدينا.
فكيف لم تذهب أن؟ معنى؟
نعم؟ لا؟ ربما؟ حسنا.
>> الشيء الأخير الذي نقوم به بعد أن كنت قد طبعت بعد وقمنا فتح ملف لدينا:
كلما قمنا فتح ملف، لدينا دائما أن نتذكر لإغلاقه.
لأن خلاف ذلك سنقوم في نهاية المطاف تسرب الذاكرة،
باستخدام ما يصل اصفات الملف.
ذلك لإغلاقه، التي تعمل نستخدم؟ دانيال؟
[دانيال] fclose؟ fclose >>، بالضبط.
لذلك كان الجزء الأخير من هذه المشكلة بشكل صحيح إغلاق الملف، وذلك باستخدام وظيفة fclose،
والتي تبدو تماما مثل ذلك.
لا مجنونة جدا.
بارد.
ذلك أن المشكلة 33 على هذه المسابقة.
سيكون لدينا بالتأكيد أكثر ملف I / O الخروج.
سنفعل أكثر قليلا في محاضرة اليوم، أو في القسم اليوم،
لأن هذا هو ما يحدث لتشكيل الجزء الأكبر من هذه pset المقبلة.
دعنا ننتقل من هذه المسابقة في هذه المرحلة. نعم؟
>> [شارلوت]] لماذا fclose (ملف) بدلا من fclose (staff.csv)؟
آه >>. لأنه تبين أن - لذلك السؤال، الذي هو واحد كبير،
هو السبب، عندما نكتب fclose، نحن fclose كتابة متغير نجمة (ملف)
بدلا من اسم الملف، staff.csv؟ فهل هذا صحيح؟ نعم.
لذلك دعونا نلقي نظرة. إذا كنت التبديل إلى جهاز الكمبيوتر المحمول،
ودعونا ننظر في وظيفة fclose.
وبالتالي فإن وظيفة fclose يغلق تيار ويستغرق في المؤشر إلى تيار أننا نريد أن يغلق،
بدلا من اسم الملف الفعلي الذي نريد إغلاقه.
وذلك لأن وراء الكواليس، عند إجراء مكالمة إلى الدالة fopen،
عند فتح الملف، كنت في الواقع تخصيص الذاكرة لتخزين المعلومات عن الملف.
بحيث يكون لديك مؤشر الملف يحتوي على معلومات حول الملف،
مثل انها مفتوحة، وحجمها، حيث كنت حاليا في الملف،
بحيث يمكنك إجراء مكالمات القراءة والكتابة إلى أن مكان معين داخل الملف.
كنت في نهاية المطاف يغلق المؤشر بدلا من إغلاق اسم الملف.
>> نعم؟ [دانيال] ذلك من أجل استخدام تأجير، هل سوف تقول - كيف تحصل على مدخلات المستخدم؟
لا تتصرف مثل GetString في fprintf بمعنى أنه سوف ننتظر فقط لإدخال المستخدم
وأطلب منك أن اكتب هذا - أو الانتظار لكتابة هذه الأمور الثلاثة في؟
أو هل تحتاج إلى استخدام شيء لتنفيذ استئجار؟
نعم >>. لذلك نحن لسنا - كان السؤال، كيف نحصل على إدخال المستخدم
من أجل تنفيذ استئجار؟ وما لدينا هنا هو المتصل من تأجير،
مرت في هذا البنية الموظفين مع كافة البيانات المخزنة في البنية بالفعل.
ذلك هو fprintf قادرا على الكتابة فقط أن البيانات مباشرة إلى الملف.
ليس هناك انتظار إدخال المستخدم.
بالفعل بالنظر الى المستخدم عن طريق وضع الإدخال بشكل صحيح في هذا البنية الموظفين.
والأشياء، بطبيعة الحال، إذا كسر أي من هذه المؤشرات لاغية،
لذلك نحن انتقل إلى هنا حتى ونحن نتطلع في البنية دينا.
لدينا سلسلة الماضي، السلسلة الأولى، والبريد الإلكتروني السلسلة.
ونحن نعرف الآن أن كل تلك حقا، تحت غطاء محرك السيارة، من المتغيرات * شار.
التي قد تكون أو لا تكون لافتا إلى قيمة خالية.
أنها قد تكون لافتا إلى الذاكرة على الكومة،
الذاكرة ربما على المكدس.
نحن لا نعرف حقا، ولكن، إذا كان أي من هذه المؤشرات تعتبر لاغية، أو غير صالحة
أن يتلف التي سوف بالتأكيد لدينا وظيفة تأجير.
كان ذلك شيئا هو نوع من خارج نطاق الامتحان.
نحن لا يدعو للقلق بشأن ذلك.
كبيرة. حسنا. الانتقال هلم جرا من هذه المسابقة.
>> دعونا إغلاق هذا الرجل، ونحن سوف ننظر في pset 4.
إذا كان الأمر كذلك يا رفاق إلقاء نظرة على المواصفات pset، مرة واحدة يمكنك الوصول إليه، cs50.net/quizzes،
ونحن في سبيلنا للذهاب من خلال عدد قليل من المشاكل القسم اليوم.
أنا التمرير لأسفل - قسم من الأسئلة يبدأ في الصفحة الثالثة من المواصفات pset.
والجزء الأول يطلب منك أن تذهب ومشاهدة قصيرة على إعادة توجيه والأنابيب.
الذي كان نوع من Cool قصير، يظهر لك بعض جديدة، سطر الأوامر بارد الحيل التي يمكنك استخدامها.
ثم لدينا بعض الأسئلة لكنت كذلك.
هذا السؤال الأول حول الجداول، والتي يكتب printf بشكل افتراضي،
نحن نوع من تطرق قليلا فقط قبل لحظة.
هذا fprintf التي كنا نناقش فقط يأخذ في ملف * تيار وحجتها.
fclose يأخذ في ملف تيار * كذلك،
والقيمة المرجعة من الدالة fopen يعطيك تيار * الملف أيضا.
السبب في أننا لم نر تلك قبل عندما كنا التعامل مع printf
لأن لديه printf تيار الافتراضي.
وتيار الافتراضي الذي فإنه يكتب
عليك معرفة في الأجل القصير.
حتى تأخذ بالتأكيد نظرة على ذلك.
>> في القسم اليوم، ونحن في طريقنا للحديث قليلا عن GDB،
منذ أكثر دراية كنت مع ذلك، فإن المزيد من الممارسة تحصل معها،
وأقدر عليك أن تكون لاصطياد الواقع أسفل الخلل في التعليمات البرمجية الخاصة بك.
هذا يسرع عملية التصحيح حتى بشكل هائل.
ذلك باستخدام printf، في كل مرة كنت تفعل ذلك لديك إلى إعادة ترجمة التعليمات البرمجية،
لديك لتشغيله مرة أخرى، وأحيانا يكون لديك لتحريك الدعوة printf حولها،
تعليق خارج رمز، فإنه يأخذ بعض الوقت فقط.
هدفنا هو محاولة اقناع لكم ان مع GDB، يمكنك أساسا
printf أي شيء في أي لحظة في التعليمات البرمجية ولست مضطرا ابدا الى إعادة ترجمة عليه.
ولست مضطرا ابدا لبدء والحفاظ على التخمين أين printf المقبل.
أول شيء فعله هو نسخ هذا الخط، والحصول على رمز القسم الخروج من شبكة الإنترنت.
أنا نسخ هذا السطر من التعليمات البرمجية التي تقول، "http://cdn.cs50.net مجلد مشترك".
أنا ذاهب لنسخه.
انا ذاهب للذهاب الى بلدي الأجهزة، تصغير حتى تتمكن من رؤية ما أفعله،
صقه في هناك، وعندما ضرب أدخل هذا الأمر مجلد مشترك على شبكة الإنترنت هو حرفيا الحصول عليها.
انه سيكون لهدم هذا الملف الخروج من الإنترنت،
وانه سيكون لحفظه إلى الدليل الحالي.
الآن إذا كنت أقوم بها حاليا قائمة الدليل يمكنك أن ترى أن أنا عندي هذا الملف section5.zip الحق في هناك.
وطريقة للتعامل مع هذا الرجل هو فك الضغط عن الملف،
والتي يمكن أن تفعل في سطر الأوامر، تماما مثل ذلك.
Section5.zip.
التي سوف فك الضغط عن الملف، إنشاء المجلد بالنسبة لي،
تضخيم كل محتويات، ووضعها في هناك.
حتى الآن لا أستطيع الخوض في دليل بلدي 5 القسم باستخدام الأمر cd.
مسح الشاشة باستخدام واضحة. مسح حتى الشاشة.
الآن لقد حصلت على محطة لطيفة نظيفة للتعامل معها.
>> إذا أنا الآن سرد كافة الملفات التي أرى في هذا الدليل،
ترى أنني قد حصلت على أربعة ملفات: buggy1، buggy2، buggy3، وbuggy4.
لقد حصلت أيضا على المقابلة. الملفات ج.
نحن لن ننظر إلى الملفات ج. في الوقت الراهن.
بدلا من ذلك، ونحن في طريقنا لاستخدامها عندما نفتح الباب GDB.
لقد حافظنا حول لهم حتى نتمكن من الوصول إلى شفرة المصدر الفعلي عندما نستخدمه GDB،
ولكن الهدف من هذا الجزء من الفرع إلى العبث حولها مع GDB
ونرى كيف يمكننا استخدامها لمعرفة ما يجري خطأ مع كل من هذه البرامج عربات التي تجرها الدواب الأربعة.
لذلك نحن مجرد الذهاب الى جميع أنحاء الغرفة بسرعة حقا،
وانا ذاهب الى تسأل شخص ما لتشغيل أحد البرامج عربات التي تجرها الدواب،
وبعد ذلك سوف نذهب كمجموعة من خلال GDB، وسنرى ما يمكننا القيام به لإصلاح هذه البرامج،
أو على الأقل تحديد ما على غير ما يرام في كل منها.
دعونا نبدأ مع دانيال أكثر من هنا. سيتم تشغيل buggy1؟ دعونا نرى ما سيحدث.
[دانيال] ويقول هناك خطأ التطبيق. نعم >>. بالضبط.
حتى إذا قمت بتشغيل buggy1، أحصل على خطأ SEG.
عند هذه النقطة، يمكن أن أذهب وفتح buggy1.c،
محاولة لمعرفة ما على غير ما يرام،
ولكن واحدة من أكثر الأمور البغيضة حول هذا الخطأ خطأ SEG
هو أنه لا اقول لكم على ما سطر من الأشياء الخاطئة البرنامج فعلا ذهبت وكسر.
كنت نوع من أن ننظر إلى رمز
ومعرفة باستخدام تخمين وتحقق printf أو لمعرفة ما على غير ما يرام.
واحدة من أروع الأشياء عن GDB هو أنه حقا، حقا سهلة
لمعرفة خط الذي تعطل البرنامج.
انه يستحق ذلك تماما لاستخدامها، حتى لو لمجرد ذلك.
حتى ليصل الحذاء GDB، اكتب I GDB، ثم أعطيها المسار إلى القابل للتنفيذ الذي اريد ان اشغل.
أنا هنا بكتابة GDB ./buggy1.
ضرب أدخل. يعطيني كل هذه المعلومات حق المؤلف،
وإلى هنا سترى هذا الخط الذي يقول: "من رموز القراءة / الوطن /
jharvard/section5/buggy1 ".
وإذا سارت الامور بشكل جيد، سوف نرى ذلك بطباعة الرسالة التي يبدو مثل هذا.
انها سوف قراءة الرموز، وأنها سوف يقول "أنا أقرأ الرموز من الملف القابل للتنفيذ الخاص بك"
وبعد ذلك سوف يكون هذا "فعل" رسالة إلى هنا.
إذا كنت ترى بعض الاختلاف أخرى من هذا، هل يمكن أن نرى أو لا تجد الرموز
أو شيء من هذا القبيل، ما يعنيه ذلك هو انك لم يجمعوا تنفيذ الخاص بك بشكل صحيح.
عندما كنا تجميع البرامج للاستخدام مع GDB، لدينا لاستخدام هذا العلم الخاصة غرام،
وانها فعلت ذلك بشكل افتراضي إذا كنت ترجمة البرامج الخاصة بك، فقط بكتابة جعل
عربات التي تجرها الدواب أو إجراء أو إجراء استرداد، أي من هؤلاء.
ولكن إذا كنت تجميع يدويا مع ضجيج، ثم عليك أن تذهب في ادراج ذلك والجميع العلم.
>> عند هذه النقطة، الآن أن لدينا لدينا موجه GDB،
انها بسيطة جدا لتشغيل البرنامج.
يمكننا كتابة إما تشغيل، أو يمكننا فقط اكتب ص.
يمكن أن تكون الأوامر الأكثر GDB مختصرة.
عادة واحدة فقط أو الرسائل زوجين، التي هي لطيفة جدا.
سعد ذلك، إذا قمت بكتابة البحث وهاهنا، ماذا يحدث؟
[سعد] وصلت SIGSEGV، خطأ تجزئة، وبعد ذلك كل الهراء هذا.
نعم >>.
مثل نراه على الشاشة في الوقت الراهن، ومثل سعد قال،
عندما كنا اكتب المدى أو r وضرب أدخل، ونحن لا يزال الحصول على خطأ SEG نفسه.
وذلك باستخدام GDB لا يحل مشكلتنا.
لكنه يتيح لنا بعض الهراء، وتبين أن هذا الهراء
يقول لنا الواقع حيث يحدث.
تحليل هذا قليلا قليلا، وهذا الشيء الأول هو وظيفة في كل شيء والتي على غير ما يرام.
هناك __ strcmp_sse4_2 هذا، ويخبرنا أنه يحدث في هذا الملف
دعا sysdeps/i386، كل هذا، مرة أخرى، نوع من الفوضى - ولكن خط 254.
وهذا النوع من الصعب تحليل. عادة عندما ترى مثل هذه الاشياء،
وهذا يعني أن يخطأ انها SEG في واحدة من المكتبات النظام.
ذلك أن تفعل شيئا مع strcmp. شهدت يا رفاق strcmp من قبل.
لا مجنونة جدا، ولكن هل هذا يعني أن يتم تقسيم strcmp أو أن هناك مشكلة مع strcmp؟
ما رأيك الكسندر؟
[ألكسندر] هل هذا - هو 254 خط؟ و- وليس ثنائي، ولكنها ليست حدودها القصوى،
وبعد ذلك هناك لغة أخرى لكل وظيفة. هو أن تلك الوظيفة 254 في، أو -؟
انها >> خط 254. يبدو في هذا الملف ثانية.، لذلك ربما رمز التجميع.
>> ولكن، أعتقد أن الشيء الأكثر إلحاحا هو، لأننا قد حصلت على خطأ SEG،
ويبدو انها قادمة من وظيفة strcmp،
هل هذا يعني، إذن، أن يتم تقسيم strcmp؟
فإنه لا ينبغي، ونأمل. ذلك فقط لأن لديك خطأ تجزئة
في واحدة من وظائف النظام، وهذا عادة يعني أنك فقط لم يطلق عليه بشكل صحيح.
أسرع ما يمكن فعله لمعرفة ما يجري في الواقع على
عندما ترى شيئا مثل هذا الجنون، كلما رأيت خطأ SEG،
وخاصة إذا كان لديك برنامج هذا ما تستخدم أكثر من مجرد الرئيسي،
هو استخدام التتبع المعاكس.
I اختصار التتبع المعاكس من خلال كتابة BT، بدلا من الكلمة التتبع المعاكس كاملة.
ولكن شارلوت، فإن ما يحدث عند كتابة BT وهاهنا؟
[شارلوت] ويظهر لي خطين، 0 خط وسطر 1.
نعم >>. 0 حتى خط وسطر 1.
هذه هي إطارات المكدس الفعلية التي هي حاليا في اللعب عندما تحطمت البرنامج.
بدءا من أعلى الإطار، إطار 0، والذهاب إلى أكثر من الأسفل، وهو الإطار 1.
لدينا أعلى الإطار هو الإطار strcmp.
يمكنك التفكير في هذا مماثلة لتلك المشكلة كما كنا نفعل فقط على هذه المسابقة مع المؤشرات،
حيث كان لدينا مبادلة إطار مكدس على رأس الإطار الرئيسي مكدس،
وكان لدينا المتغيرات التي كانت تستخدم المبادلة على رأس المتغيرات التي كانت تستخدم الرئيسي.
حدث هنا تحطم لدينا في وظيفتنا strcmp، الذي كان يسمى من قبل وظيفتنا الرئيسية،
والتتبع المعاكس ويعطينا ليس فقط في وظائف الأشياء التي فشلت،
ولكنه يقول لنا أيضا حيث كان يسمى كل شيء من.
حتى لو كنت على تمرير أكثر من ذلك بقليل للحق،
يمكننا أن نرى أن نعم، كنا على خط 254 من هذا الملف strcmp-sse4.s.
ولكن هذه الدعوة في 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].
كان هذا شيئا عن تحطمها.
حتى ميسي، هل لديك أية أفكار حول ما يمكن أن يحدث هنا؟
[ميسي] أنا لا أعرف لماذا انها تحطمها. أنت >> لا أعرف لماذا انها تحطمها؟
جيمي، أي أفكار؟
[جيمي] لست متأكدا تماما، ولكن في المرة الأخيرة مقارنة كنا السلسلة،
أو strcmp، كان لدينا ثلاث حالات مختلفة مثل ظله.
لم يكن لدينا ل==، لا أعتقد، والحق في أن السطر الأول.
بدلا من ذلك تم فصلها إلى ثلاثة، واحد كان == 0،
واحد كان <0، كما أعتقد، واحد كان> 0.
لذلك ربما شيء من هذا القبيل؟ نعم >>. ولذلك لا يوجد هذا الموضوع
من نحن فاعلون المقارنة بشكل صحيح؟
ستيلا؟ أي أفكار؟
[ستيلا] لست متأكدا. لست متأكدا >>. دانيال؟ الأفكار؟ حسنا.
تبين ما يحدث هنا هو عندما هربنا البرنامج
وحصلنا على خطأ SEG، عندما قمت بتشغيل البرنامج للمرة الأولى، دانيال،
هل تقدم له أية وسائط سطر الأوامر؟
[دانيال] رقم >> رقم في هذه الحالة، ما هي قيمة argv [1]؟
لا يوجد >> قيمة. الحق >>.
حسنا، ليس هناك قيمة السلسلة المناسبة.
ولكن هناك بعض القيمة. ما هي القيمة التي يحصل المخزنة في هناك؟
A >> قيمة القمامة؟ انها >> إما قيمة أو القمامة، في هذه الحالة،
يتم إنهاء دائما نهاية الصفيف مع argv فارغة.
وذلك ما حصل فعلا هناك المخزنة في باطل.
في الاتجاه الآخر لحل هذه، بدلا من التفكير من خلال،
هو محاولة الطباعة من ذلك.
هذا هو المكان الذي كنت أقول أن استخدام GDB كبيرة،
لأنه يمكنك طباعة جميع المتغيرات، وجميع القيم التي تريد
باستخدام هذا الأمر مفيد ص-مدهش.
حتى لو كنت اكتب ع وبعد ذلك اكتب قيمة متغير أو اسم متغير،
يقول argc، أرى أن argc هو 1.
إذا كنت ترغب في طباعة argv [0]، ويمكنني أن تفعل ذلك فقط من هذا القبيل.
وكما رأينا، argv [0] دائما اسم البرنامج الخاص بك،
دائما اسم الملف القابل للتنفيذ.
هنا ترى انها حصلت على اسم المسار الكامل.
يمكنني أيضا طباعة من argv [1] ونرى ما سيحدث.
>> وصلنا إلى هنا هذا النوع من قيمة باطني.
وصلنا هذا 0x0.
تذكر في بداية الفصل الدراسي عندما تحدثنا عن أرقام ست عشرية؟
أو هذا السؤال قليلا في نهاية pset 0 من كيفية تمثيل 50 في عرافة؟
الطريقة نكتب الأرقام في عرافة CS، لمجرد عدم الخلط بين أنفسنا
مع الأرقام العشرية، هو أننا دائما البادئة 0x لهم.
لذلك هذا البادئة 0x دائما يعني فقط تفسير الرقم التالي إلى عدد عشري،
لا كسلسلة، وليس كرقم عشري، وليس كما رقم ثنائي.
ولما كان عدد 5-0 هو رقم صحيح في ست عشري.
وانها في عدد عشري، 50.
لذلك هذا هو فقط كيف أننا أزل غموض.
حتى وسائل 0x0 0 ست عشري، الذي هو أيضا العشرية 0، ثنائي 0.
انها مجرد القيمة 0.
وتبين أن هذا ما هو باطل، في الواقع، في الذاكرة.
هو مجرد فارغة 0.
هنا، العنصر المخزنة في argv [1] فارغة.
لذلك نحن نحاول المقارنة لدينا "CS50 الصخور" السلسلة إلى سلسلة فارغة.
يعتبر إلغاء مرجعية حتى فارغة، في محاولة للوصول إلى الأشياء في فارغة،
تلك تسير عادة أن تسبب نوعا من الخطأ تجزئة أو غيرها من الأشياء السيئة يحدث.
وتبين أن strcmp لا تحقق لمعرفة
أم لا لقد مرت عليك في قيمة هذا باطل.
بدلا من ذلك، يذهب فقط إلى الأمام، يحاول بذل كل شيء،
وإذا كان SEG أخطاء، فإنه SEG أخطاء، وانها مشكلتك. عليك أن تذهب اصلاحها.
بسرعة حقا، كيف يمكن لنا إصلاح هذه المشكلة؟ شارلوت؟
[شارلوت] يمكنك التحقق باستخدام إذا.
إذا كان الأمر كذلك argv [1] باطل، == 0، ثم العودة 1، أو شيء (غير مفهوم).
نعم >>. بحيث واحد طريقة رائعة للقيام بذلك، ونحن يمكن أن تحقق لمعرفة،
القيمة نحن على وشك أن تنتقل إلى strcmp، argv [1]، وكأن لم؟
إذا فارغة انها، ثم يمكننا أن نقول حسنا، إحباط.
>> وهناك طريقة أكثر شيوعا للقيام بذلك هو استخدام قيمة argc.
يمكنك ان ترى هنا في بداية الرئيسي،
نحن حذفت أن الاختبار الأول الذي نقوم به عادة عندما نستخدم وسائط سطر الأوامر،
وهو اختبار ما إذا كان أو لا قيمة لدينا argc هو ما نتوقع.
في هذه الحالة، نتوقع على الأقل من الحجج،
اسم البرنامج زائد واحد آخر.
لأننا على وشك استخدام الوسيطة الثانية هنا.
وذلك بعد نوعا من الاختبار من قبل، قبل دعوتنا strcmp
من شأنها أن الاختبارات أم لا argv هو لا يقل عن 2، كما تفعل نفس الشيء.
يمكننا أن نرى ما اذا كان يعمل عن طريق تشغيل البرنامج مرة أخرى.
يمكنك إعادة تشغيل البرنامج دائما داخل GDB، التي هي لطيفة حقا.
يمكنك تشغيل، وعند تمرير الوسائط إلى البرنامج في الكمبيوتر،
كنت مارة في تشغيل عند استدعاء، وليس عند الحذاء GDB.
بهذه الطريقة يمكنك الاحتفاظ استدعاء البرنامج مع الحجج مختلفة في كل مرة.
تشغيل ذلك، أو مرة أخرى، أستطيع أن اكتب R، ودعونا نرى ما سيحدث لو أننا اكتب "مرحبا".
سوف يطلب منك إذا كنت دائما تريد أن تبدأ من البداية مرة أخرى.
عادة، كنت لا تريد أن تبدأ من البداية مرة أخرى.
وعند هذه النقطة، إعادة تشغيل مرة أخرى، فإنه يطبع خارج
البرنامج الذي نحن على التوالي، buggy1، مع حجة مرحبا،
وهذا فإنه يطبع من معيار، بل يقول: "يمكنك الحصول على D،" وجها حزينا.
لكننا لم SEG خطأ. وقال أن عملية خرجت بشكل طبيعي.
بحيث تبدو جيدة.
أي خطأ أكثر SEG، التي قطعناها على أنفسنا من الماضي،
لذلك يبدو أن الواقع كان علة خطأ SEG التي كنا نحصل.
للأسف، فإنه يقول لنا أننا الحصول على D.
>> يمكن أن نعود وننظر في رمز ونرى ما يجري هناك
لمعرفة ما كان - لماذا كان يقول لنا ان حصلنا على D.
دعونا نرى، وهذا القول هنا أن printf كنت حصلت على D.
إذا كان لنا أن اكتب قائمة، كما يمكنك الاحتفاظ بكتابة قائمة، فإنه يحتفظ بالتكرار إلى الأسفل من خلال البرنامج الخاص بك،
ذلك أنها سوف تظهر لك الأسطر القليلة الأولى من البرنامج.
ثم سوف تظهر لك السطور القادمة القليلة، وقطعة قطعة المقبل والمقبل.
وأنها سوف تحاول أن تبقي للذهاب إلى أسفل.
والآن سوف نصل الى "الخط رقم 16 هو خارج النطاق."
لأنه ليس لديها سوى 15 خطوط.
إذا كنت تحصل على هذه النقطة والخاص متسائلا "ماذا أفعل؟" يمكنك استخدام الأمر المساعدة.
استخدام تعليمات ثم تعطيه اسم أمر.
وترى GDB يعطينا كل هذا النوع من الاشياء.
فإنه يقول: "ومع عدم وجود حجة، تحدد عشر بعد أكثر من الخطوط أو حول القائمة السابقة.
قائمة - يسرد خطوط العاشرة قبل - "
لذلك دعونا حاول استخدام ناقص القائمة.
وتسرد خطوط 10 السابقة؛ يمكن أن تقوم به حولها مع قائمة قليلا.
يمكنك القيام قائمة، قائمة -، يمكنك إعطاء قائمة حتى رقم، مثل قائمة 8،
وانها سوف قائمة الخطوط حوالي 10 السطر 8.
ويمكنك ان ترى ما يحدث هنا هو أن لديك بسيطة إذا آخر.
إذا قمت بكتابة CS50 في الصخور، فإنه يطبع خارجا "تحصل على A."
وإلا فإنه بطباعة "تحصل على D."
المشكله المدينة. حسنا. نعم؟
>> [دانيال] لذلك عندما حاولت القيام CS50 الصخور بدون الاقتباس،
تقول "يمكنك الحصول على D."
أنا في حاجة إلى الاقتباس الحصول على عمل، لماذا ذلك؟
نعم >>. تبين أنه عندما - وهذا هو آخر طعام شهي القليل من المرح -
عند تشغيل البرنامج، واذا كنا تشغيله ونحن في CS50 اكتب الصخور،
تماما مثل دانيال وقال انه فعل، وأنت هاهنا،
تقول تزال نحصل على D.
والسؤال هو، لماذا هذا؟
وتبين أن كلا من لدينا محطة وتحليل هذه GDB عن اثنين من الحجج منفصلة.
لأن عندما يكون هناك مسافة، وهذا يعني كما
انتهت الوسيطة الأولى، والحجة التالية هي على وشك أن تبدأ.
الطريق إلى الجمع بين تلك إلى قسمين، أو عذرا، إلى وسيطة واحدة،
هو استخدام علامات التنصيص.
حتى الآن، إذا وضعنا في الاسعار وتشغيله مرة أخرى، ونحن الحصول على A.
حتى لمجرد باختصار، لا يتم تحليل عروض الأسعار وCS50 والصخور عن اثنين من الحجج منفصلة.
مع الاسعار، انها تحليل بأنها وسيطة واحدة تماما.
>> يمكننا أن نرى ذلك مع نقطة توقف.
حتى الآن كنا تشغيل برنامجنا، وانه تم تشغيله
حتى إما أن SEG أخطاء أو ضربات خطأ
أو حتى أنها قد خرجت وأصبحت الامور بخير تماما.
هذه ليست بالضرورة الشيء الأكثر مفيدة، لأن في بعض الأحيان
لديك خطأ في البرنامج، لكنه لا يسبب تجزئة الخطأ.
انها لا تسبب البرنامج إلى إيقاف أو أي شيء من هذا القبيل.
الطريق للحصول على GDB إلى وقفة البرنامج عند نقطة معينة
هو تعيين نقطة توقف.
يمكنك القيام بذلك عن طريق إما تعيين نقطة توقف على اسم الدالة
أو يمكنك تعيين نقطة توقف على خط معين من التعليمات البرمجية.
أود أن تعيين نقاط إيقاف على أسماء دالة، لأنه - من السهل أن نتذكر،
وإذا ذهبت فعلا في تغيير والتعليمات البرمجية المصدر قليلا قليلا،
ثم توقف إقامتك في الواقع في نفس المكان داخل التعليمات البرمجية.
في حين إذا كنت تستخدم أرقام الأسطر، وتغيير أرقام الأسطر
لأنك إضافة أو حذف بعض التعليمات البرمجية، ثم يتم شد جميع نقاط التوقف الخاصة بك تماما حتى.
وضعت واحدة من أكثر الأمور شيوعا أفعل نقطة توقف على الدالة الرئيسية.
في كثير من الأحيان سوف يصل الحذاء GDB، وأنا من النوع B الرئيسي، هاهنا، والتي سوف تعيين نقطة توقف
على الوظيفة الرئيسية التي تقول فقط، "وقفة البرنامج بمجرد بدء تشغيل"
وبهذه الطريقة، عند تشغيل برنامجي مع، ويقول، CS50 الصخور وحجتان
وضرب أدخل، فإنه يحصل على الوظيفة الرئيسية ويتوقف الحق في السطر الأول جدا،
الحق قبل فالتقييم وظيفة strcmp.
>> منذ توقف أنا أنا، والآن أستطيع أن أبدأ التلويث ورؤية حول ما يحدث
مع كل من المتغيرات المختلفة التي تم تمريرها في برنامجي.
هنا يمكنني طباعة argc ونرى ما يحدث.
نرى أن argc هو 3، لأنها حصلت على 3 قيم مختلفة في ذلك.
انها حصلت على اسم البرنامج، انها حصلت على الوسيطة الأولى والوسيطة الثانية.
يمكننا طباعة هذه من خلال النظر في argv [0]، argv [1]، وargv [2].
حتى الآن يمكنك ان ترى لماذا هذه الدعوة strcmp سوف تفشل،
لأنك ترى أنه لم تقسيم للCS50 والصخور إلى قسمين منفصلين الحجج.
عند هذه النقطة، مرة واحدة كنت قد بلغت نقطة توقف، يمكنك متابعة إلى الخطوة من خلال برنامج
سطرا سطرا، بدلا من بدء تشغيل البرنامج مرة أخرى.
حتى إذا كنت لا تريد أن تبدأ البرنامج مرة أخرى وتواصل فقط القراءة من هنا،
يمكنك استخدام الأمر ما زالت مستمرة وسوف تستمر تشغيل البرنامج حتى النهاية.
مثلما فعلت هنا.
ومع ذلك، إذا كنت إعادة تشغيل البرنامج، CS50 الصخور، كان يضرب توقف بلدي مرة أخرى،
وهذه المرة، إذا كنت لا تريد أن فقط يذهب كل في طريقه من خلال ما تبقى من البرنامج،
يمكنني استخدام الأمر التالي، وأنا أيضا مع اختصار ن.
وهذه الخطوة سوف من خلال خط برنامج سطرا.
حتى تتمكن من مشاهدة الأشياء كما تنفيذ، والمتغيرات التغيير، والحصول على تحديث الأشياء.
وهو لطيف جدا.
والشيء الآخر هو بارد بدلا من تكرار الأمر نفسه مرارا وتكرارا وتكرارا،
إذا كنت مجرد ضرب أدخل - حتى هنا ترى أنا لم كتبته في أي شيء -
إذا كنت مجرد ضرب أدخل، فإنه سيتم تكرار الأمر السابق،
أو الأمر GDB السابقة التي أنا فقط وضعت فيه.
يمكنني الحفاظ على ضرب أدخل وسوف تبقى التنقل خلال قانون بلدي خط سطرا.
وأود أن أشجعكم اللاعبين لتذهب للتحقق من البرامج عربات التي تجرها الدواب الأخرى كذلك.
ليس لدينا الوقت للحصول على كل منهم من خلال اليوم في القسم.
شفرة المصدر هو هناك، حتى تتمكن من نوع من معرفة ما يجري
وراء الكواليس إذا واجهتك مشكلة حقا لكم،
ولكن على أقل تقدير، وممارسة فقط تمهيد GDB،
تشغيل البرنامج حتى يكسر عليك،
الحصول على التتبع المعاكس، ومعرفة ما يعمل الحادث كان في،
ما كان على خط وطباعة بعض قيم المتغيرات،
لذلك أنت فقط التعود على ذلك، لأن من شأنها أن تساعد حقا لكم في المستقبل.
في هذه المرحلة، ونحن في طريقنا لإنهاء من GDB، والتي لا تستخدم أو مجرد ترك س.
إذا كان البرنامج الخاص بك هو في منتصف يزال قيد التشغيل، وأنها خرجت لا،
سوف أطلب دائما لكم، "هل أنت متأكد من أنك تريد حقا أن تترك؟"
يمكنك مجرد ضرب نعم.
>> الآن ونحن في طريقنا للنظر في المشكلة القادمة لدينا، والذي هو برنامج القط.
إذا كنت قصيرة على مشاهدة إعادة توجيه وخراطيم سترى أن يستخدم هذا البرنامج تومي
الذي يطبع كافة الإخراج أساسا من ملف إلى الشاشة.
إذا كان الأمر كذلك أركض القط، وهذا هو في الواقع برنامج المدمج في الجهاز ل،
وإذا كان لديك أجهزة ماكينتوش يمكنك القيام بذلك على ماك الخاص بك أيضا، إذا كنت فتح المعبر.
ونحن - القط، دعنا نقول، cp.c، وضرب أدخل.
ما هذا فعل، واذا كنا انتقل لأعلى قليلا ونرى أين نحن ركض الخط،
أو عندما هربنا الأمر القط، فإنه حرفيا طبع للتو محتويات الشاشة إلى cp.c لدينا.
يمكننا تشغيله مرة أخرى ويمكنك وضعها في ملفات متعددة معا.
حتى تتمكن من القيام cp.c القط، وبعد ذلك يمكننا أيضا سلسلة ملف cat.c،
وهو البرنامج الذي على وشك الكتابة،
وأنها سوف طباعة كل الملفات العودة إلى الوراء إلى شاشة لدينا.
حتى إذا كنا انتقل لأعلى قليلا، ونحن نرى أنه عندما ركضنا هذا cp.c القط، cat.c،
طبع لأول مرة خارج الملف القطري، ومن ثم تحته، فإنه تطبع الملف cat.c الحق هنا إلى أسفل.
نحن ذاهبون الى استخدام هذا لمجرد الحصول على أقدامنا الرطب.
لعب مع حولها الطباعة بسيطة لمحطة، انظر كيف يعمل.
إذا يا رفاق فتح مع gedit cat.c، هاهنا،
تستطيع أن ترى في البرنامج الذي نحن على وشك الكتابة.
لقد تضمنت هذه لوحة جميلة المرجل، لذلك ليس لدينا لقضاء بعض الوقت بكتابة كل ما بها.
ونحن أيضا التحقق من عدد من الحجج تمريره.
نحن طباعة رسالة لطيفة الاستخدام.
>> هذا هو النوع من الشيء الذي، مرة أخرى، وكأننا نتحدث عن،
انها تقريبا مثل الذاكرة العضلات.
فقط تذكر لتستمر في فعل نفس النوع من الاشياء
والطباعة دائما نوعا من رسالة مفيدة
لدرجة أن الناس يعرفون كيفية تشغيل البرنامج.
مع القط، انها بسيطة جدا، ونحن في طريقنا للذهاب فقط من خلال كل من الحجج المختلفة
صدرت أن برنامجنا، ونحن في طريقنا للطباعة
محتوياتها إلى الشاشة في وقت واحد.
من أجل طباعة الملفات إلى الشاشة، ونحن في طريقنا للقيام بشيء مماثل للغاية
لماذا فعلنا في نهاية هذه المسابقة.
في نهاية هذه المسابقة، التي توظف البرنامج، كان لدينا لفتح الملف،
ومن ثم كان علينا أن الطباعة إليها.
في هذه الحالة، ونحن في طريقنا لفتح الملف، ونحن في طريقنا للقراءة منه بدلا من ذلك.
ثم ونحن في طريقنا للطباعة، بدلا من ملف، ونحن في طريقنا لطباعة على الشاشة.
الطباعة حتى إلى الشاشة كنت قد فعلت من قبل مع جميع printf.
بحيث لا مجنونة جدا.
لكن قراءة ملف هو نوع من غريب.
سوف نذهب من خلال قليلا أن القليل في وقت واحد.
إذا يا رفاق العودة لتلك المشكلة مشاركة في مسابقة الخاصة بك، مشكلة 33،
السطر الأول أننا في طريقنا للقيام هنا، وفتح ملف، هي مشابهة جدا لما فعلناه هناك.
حتى ستيلا، ما يفعل ذلك نظرة مثل خط، ونحن عندما فتح ملف؟
[ستيلا] FILE * رأس المال، ملف - >> حسنا. >> - تساوي الدالة fopen. نعم >>.
وهو في هذه الحالة هو؟ انها في التعليق.
انها >> في التعليق؟ argv [i] و ص؟
بالضبط >>. على حق. ذلك صحيح تماما ستيلا.
هذا هو ما يبدو وكأنه خط.
ونحن في طريقنا للحصول على متغير تيار الملف، واحفظها في ملف * FILE، لذلك كل مباراة دولية،
سوف FILE، *، واسم هذا المتغير يكون الملف.
يمكن أن نسميها ما نشاء. يمكن أن نسميها first_file، أو file_i، مهما نود.
ومن ثم تم تمرير اسم الملف في على سطر الأوامر لهذا البرنامج.
لذلك يتم تخزينها في argv [أنا] ثم ونحن في طريقنا لفتح هذا الملف في وضع القراءة.
والآن بعد أن قمنا فتح الملف، ما هو الشيء الذي لدينا أن نتذكر دائما أن تفعل
لقد فتحنا كلما ملف؟ إغلاقه.
حتى ميسي، كيف يمكننا إغلاق ملف؟
[ميسي] fclose (ملف) >> fclose (ملف). بالضبط.
كبيرة. حسنا. إذا نظرنا إلى هذا القيام تعليق هنا،
تقول، "فتح argv [i] و طباعة محتوياته إلى STDOUT."
>> من معيار هو اسم غريب. STDOUT هو مجرد لدينا طريقة للقول
نريد أن طباعته إلى محطة، ونحن نريد أن طباعته إلى دفق إخراج قياسي.
يمكننا في الواقع الحصول على التخلص من هذا التعليق هنا.
أنا ذاهب لنسخه ولصقه ومنذ ذلك ما فعلناه.
في هذه المرحلة، والآن لدينا لقراءة ملف بت فشيئا.
لقد ناقشنا عدة طرق لقراءة الملفات.
تلك التي هي المفضلة لديك حتى الآن؟
طرق التي هل رأيت أو هل تذكرين، لقراءة الملفات؟
[دانيال] fread؟ fread >>؟ fread ذلك هو واحد. جيمي، هل تعرف أي أشخاص آخرين؟
[جيمي] رقم >> حسنا. كلا. شارلوت؟ الكسندر؟ أي أشخاص آخرين؟ حسنا.
وبالتالي فإن تلك هي آخر fgetc، هي واحدة أننا سوف تستخدم الكثير.
هناك أيضا fscanf؛ انظر يا رفاق نمط هنا؟
وتبدأ جميعها و. أي علاقة مع ملف.
هناك fread، fgetc، fscanf. هذه كلها وظائف القراءة.
للكتابة لدينا fwrite، لدينا fputc بدلا من fgetc.
لدينا أيضا مثل fprintf رأينا على هذه المسابقة.
حيث أن هذه هي المشكلة التي ينطوي القراءة من ملف،
ونحن في طريقنا لاستخدام واحد من هذه الوظائف الثلاث.
نحن لا تنوي استخدام هذه الوظائف إلى هنا.
تم العثور على جميع هذه الوظائف في مكتبة I / O القياسية.
حتى إذا كنت تبحث في الجزء العلوي من هذا البرنامج،
يمكنك أن ترى أن لدينا بالفعل تضمين ملف الرأس للمكتبة I / O القياسية.
إذا كنا نريد لمعرفة أي واحد نريد للاستخدام،
يمكننا فتح دائما على صفحات رجل.
حتى نتمكن من كتابة stdio والرجل
وقراءة كل شيء عن المدخلات وstdio وظائف الإخراج في C.
ويمكننا أن نرى بالفعل يا، نظرة. انها بالذكر fgetc، انها بالذكر fputc.
حتى تتمكن من النفاذ إلى الأسفل قليلا وننظر، يقول، fgetc
وإلقاء نظرة على الصفحة رجل والخمسين.
يمكنك أن ترى أن ذلك يسير جنبا إلى جنب مع مجموعة كاملة من وظائف أخرى:
fgetc، fgets، getc، getchar، يحصل، ungetc، ومدخلاته من الحروف والجمل.
لذلك هذا هو كيف نقرأ في الشخصيات وسلاسل من الملفات من الإدخال القياسي،
التي هي في جوهرها من المستخدم.
وهذه هي الطريقة التي نفعل ذلك في C. الفعلية
لذلك هذا لا يستخدم وظائف GetString GetChar
أن كنا من مكتبة CS50.
ونحن في طريقنا للقيام بذلك مشكلة في زوجين من الطرق
بحيث يمكنك ان ترى بطريقتين مختلفتين للقيام بذلك.
كل وظيفة fread ان دانيال المذكورة وfgetc هي طرق جيدة للقيام بذلك.
أعتقد fgetc هو أسهل قليلا، لأنه يحتوي فقط، كما ترون،
وسيطة واحدة، و* FILE أن نحاول قراءة حرف من،
وقيمته هو عودة الباحث.
وهذا هو قليلا مربكة، أليس كذلك؟
>> لأننا نحصل على حرف، لذلك لماذا لا هذه العودة وشار؟
يا رفاق لديك أي أفكار حول لماذا هذا قد لا ترجع شار؟
[الأجوبة ميسي، غير مفهومة] >> نعم. ذلك صحيح تماما ميسي.
اذا كان ASCII، ويمكن بعد ذلك أن يتم تعيين هذا صحيح إلى شار الفعلية.
يمكن أن يكون حرف ASCII، وهذا صحيح.
هذا هو بالضبط ما يحدث.
نحن باستخدام الباحث لمجرد ان لديها أكثر بت.
انها أكبر من شار؛ شار لديها 8 بت فقط، أن 1 بايت على الأجهزة لدينا 32-بت.
والباحث لديه يستحق كل بايت 4 'من الفضاء.
واتضح أن الطريقة fgetc يعمل،
إذا كان لنا أن انتقل لأسفل في خلاصة لدينا في هذه الصفحة الرجل قليلا،
انتقل على طول الطريق. اتضح أنهم يستخدمون هذه القيمة خاصة تسمى EOF.
انها ثابتة خاصة حيث بلغت قيمة الإرجاع للدالة fgetc
كلما ضربت لك نهاية الملف أو إذا كنت تحصل على خطأ
واتضح أن للقيام بهذه المقارنات مع EOF بشكل صحيح،
كنت تريد أن يكون هذا المبلغ الاضافي من المعلومات التي لديك في كثافة العمليات
بدلا من استخدام متغير شار.
على الرغم من fgetc هو الحصول على نحو فعال حرف من ملف،
تريد أن نتذكر أنه يعود هذا شيء من نوع int لك.
قلت ذلك، فإنه من السهل إلى حد ما للاستخدام.
انها سوف تعطينا حرف، لذا كل ما عليك القيام به هو الحفاظ على طرح الملف،
"أعطني الحرف التالي، أعطني الحرف التالي، أعطني الحرف التالي،"
حتى نصل إلى نهاية الملف.
وسوف تسحب في ذلك حرف واحد في وقت واحد من الملف لدينا،
ومن ثم يمكننا أن نفعل كل ما نحب معها.
يمكننا تخزينها، ويمكننا أن نضيف إلى سلسلة، ونحن يمكن طباعته.
قم بأي من ذلك.
>> التكبير التراجع والعودة إلى برنامجنا cat.c،
إذا نحن ذاهبون إلى استخدام fgetc،
كيف يمكن نقترب هذا السطر التالي من التعليمات البرمجية؟
ونحن في طريقنا لاستخدام - fread سوف تفعل شيئا مختلفا قليلا.
وهذه المرة، ونحن في طريقنا لمجرد استخدام fgetc للحصول على حرف واحد في كل مرة.
لمعالجة ملف كامل، ما قد يتعين علينا القيام به؟
عدد الأحرف هناك في ملف؟
هناك الكثير. لذلك ربما كنت ترغب في الحصول على واحد
وبعد ذلك الحصول على آخر والحصول على آخر والحصول على آخر.
ما هو نوع من الخوارزمية رأيك قد يكون لدينا لاستخدام هنا؟
ما هو نوع من -؟ [ألكسندر] حلقة For؟ بالضبط >>.
نوع من الحلقة.
A لحلقة كبيرة في الواقع، في هذه الحالة.
ومثلك كانوا يقولون، يبدو وكأنه كنت ترغب في حلقة على الملف بأكمله،
الحصول على حرف في كل مرة.
أي اقتراحات بشأن ما يمكن أن تبدو وكأنها؟
[الكسندر، غير مفهومة]
حسنا >>، قل لي باللغة الإنجليزية ما كنت تحاول أن تفعل؟ [الكسندر، غير مفهومة]
حتى في هذه الحالة، وهذا يبدو وكأننا مجرد محاولة لحلقة على الملف بأكمله.
[ألكسندر] لذا أنا <حجم كثافة العمليات؟ >> حجم -؟
اعتقد ان حجم الملف، أليس كذلك؟ حجم - we'll مجرد كتابة على هذا النحو.
حجم الملف في الوقت الراهن، وأنا + +.
لذلك تبين أن طريقة القيام بذلك باستخدام fgetc، وهذا هو الجديد،
هو أن ليس هناك طريقة سهلة لمجرد الحصول على حجم ملف
مع هذا النوع "sizeof" من بناء التي كنت قد رأيت من قبل.
عندما نستخدم تلك الوظيفة fgetc، إننا نقدم نوعا من
جديدة، بناء جملة غير تقليدي لهذه الحلقة ل، حيث بدلا من مجرد استخدام عداد الأساسية
للذهاب حرف بحرف، ونحن في طريقنا لسحب حرف واحد في كل مرة،
حرف واحد في وقت واحد، والطريقة نعلم أننا في نهاية
لا تحسب عندما قمنا عدد معين من الحروف،
ولكن عندما انسحبنا الطابع هو أن نهاية الخاص للحرف الملف.
حتى نتمكن من القيام بذلك عن طريق - وأنا أسمي هذا الفصل، ونحن في طريقنا إلى تهيئة ذلك
مع دعوتنا أول من يحصل على الحرف الأول من الملف.
حتى هذا الجزء هنا، هذا هو الذهاب الى الحصول على واحد من شخصيات من الملف
وتخزينها في متغير الفصل.
ونحن في طريقنا للحفاظ على القيام بهذا حتى نصل إلى نهاية الملف،
الذي نقوم به من خلال اختبار للحرف لا يجري على قدم المساواة لذلك الحرف EOF خاصة.
ثم بدلا من القيام CH + +، والتي فقط زيادة القيمة،
إذا كان الأمر كذلك نقرأ في الخروج من الملف A، A مال، ويقول،
الفصل + + سوف تعطينا ب، ومن ثم كنا الحصول ج ثم د.
وهذا بوضوح ما لا نريده. ما نريد هنا
في هذا الجزء الأخير هو أننا نريد الحصول على الحرف التالي من الملف.
>> لذلك قد كيف نحصل على الحرف التالي من الملف؟
كيف نحصل على الحرف الأول من الملف؟
[طالب] fgetfile؟ fgetc >>، أو، آسف، كنت حق تماما.
I أخطاء إملائية أنه هناك حق. لذلك نعم.
هنا بدلا من القيام CH + +،
ونحن في طريقنا للدعوة فقط fgetc (ملف) مرة أخرى
وتخزين النتيجة في المتغير لدينا نفس الفصل.
[سؤال الطالب، غير مفهومة]
هذا هو المكان >> هؤلاء الرجال * FILE هي خاصة.
طريقة عملها هو أنها - عند فتح الأولى - عند إجراء مكالمة الدالة fopen الأولى التي،
و* FILE يخدم كمؤشر فعال إلى بداية الملف.
ثم في كل مرة استدعاء fgetc، وهو يتحرك حرف واحد من خلال الملف.
كلما بحيث يمكنك استدعاء هذا، كنت تزايد مؤشر الملف بواسطة حرف واحد.
وعند fgetc مرة أخرى، وكنت نقله حرف آخر
وحرف آخر وحرف آخر حرف وآخر.
[سؤال الطالب، غير مفهومة] >> وthat's - نعم.
انها نوع من هذا السحر تحت غطاء محرك السيارة.
عليك أن تبقي فقط من خلال تزايد.
عند هذه النقطة، وكنت قادرا على العمل فعلا مع حرف.
لذلك قد كيف يمكننا طباعة هذا إلى الشاشة، والآن؟
يمكننا استخدام نفس الشيء printf التي استخدمناها من قبل.
أن كنا باستخدام جميع فصل دراسي.
لا يمكن أن يوصف printf،
ويمكن أن نعبر في شخصية تماما مثل ذلك.
طريقة أخرى للقيام بذلك هو بدلا من استخدام printf والحاجة إلى القيام بذلك سلسلة التنسيق،
يمكننا أيضا استخدام واحدة من وظائف أخرى.
يمكننا استخدام fputc، الذي يطبع حرف على الشاشة،
إلا إذا نظرنا إلى fputc - اسمحوا لي تصغير قليلا.
نرى ما هو جميل هو ما يتطلبه الأمر في الحرف الذي تلا علينا استخدام fgetc،
ولكن بعد ذلك لدينا لاعطائها تيار الطباعة إلى.
يمكننا أيضا استخدام الدالة putchar، والتي سوف يضع مباشرة إلى خارج القياسية.
لذلك هناك مجموعة كاملة من الخيارات المختلفة التي يمكننا استخدامها للطباعة.
انهم جميعا في المكتبة I / O القياسية.
كلما كنت ترغب في طباعة - printf ذلك، افتراضيا، سوف الطباعة إلى مستوى خاص من تيار،
وهو أن STDOUT.
حتى نتمكن من الرجوع فقط إلى أنها نوع من السحر هذه القيمة، في STDOUT هنا.
عفوا. وضع الفاصلة المنقوطة في الخارج.
>> هذا هو الكثير من المعلومات، في غير تقليدي جديدة هنا.
وهناك الكثير من هذه الاصطلاحية جدا، بمعنى أن هذا هو رمز
ما هو مكتوب بهذه الطريقة لمجرد أنها نظيفة على القراءة وسهلة القراءة.
هناك العديد من الطرق المختلفة للقيام بذلك، وظائف عديدة ومختلفة يمكنك استخدامها،
لكننا نميل إلى مجرد اتباع هذه الأنماط نفسها مرارا وتكرارا.
لذلك لا ينبغي أن نندهش إذا كنت ترى رمز مثل هذا الخروج مرة أخرى ومرة ​​أخرى.
حسنا. في هذه المرحلة، نحن بحاجة إلى كسر لهذا اليوم.
أشكركم على الحضور. شكرا لمشاهدة إذا كنت على الانترنت. وسنرى في الأسبوع القادم.
[CS50.TV]