المتحدث: حتى الآن، فمن المحتمل أن معظم البرامج الخاصة بك كانت سريعة الزوال قليلا. تشغيل برنامج مثل ماريو أو الجشع. وهو يفعل شيئا، فإنه يطالب ربما المستخدم لبعض المعلومات، طباعة بعض الإخراج إلى الشاشة، ولكن بعد ذلك عندما برنامجك أكثر، هناك حقا أي دليل هناك تم تشغيله من أي وقت مضى في المقام الأول. أعني، بالتأكيد، قد كنت قد تركت فإنه فتح في إطار المحطة الطرفية، ولكن إذا قمت بمسح الشاشة، هناك حقا لا يوجد دليل أنها موجودة. ليس لدينا وسيلة لتخزين المعلومات الثابتة والمعلومات موجود لدينا بعد توقف برنامج تشغيل، أو ليس لدينا حتى هذه اللحظة. على الرغم من حسن الحظ، ج يفعل توفر لنا القدرة القيام بذلك عن طريق تنفيذ ما يسمى ملف، بنية الأساس يمثل الملف الذي سيضاعف انقر على جهاز الكمبيوتر الخاص بك، إذا كنت تستخدم لبيئة المستخدم الرسومية. عموما عند العمل مع ج، ونحن في الواقع الذهاب للعمل مع مؤشرات إلى files-- ملف stars-- باستثناء قليلا عندما نتحدث عن بضعة من الوظائف التي العمل مع مؤشرات الملفات. أنت لست بحاجة إلى أن حفروا حقا عميق جدا في فهم مؤشرات أنفسهم. هناك قليلا قليلا تيني حيث سنتحدث عنها، لكن ملف عموما مؤشرات و مؤشرات، في حين مترابطة، ليست بالضبط نفس الشيء. الآن ماذا يعني عندما أقول البيانات المستمرة؟ ما هو البيانات المستمرة؟ لماذا نهتم به؟ نقول، على سبيل المثال، أن كنت تقوم بتشغيل برنامج أو كنت قد لإعادة كتابة برنامج لعبة، وأنت تريد أن تتبع جميع تحركات المستخدم ذلك أنه ربما إذا كان هناك شيء يذهب على نحو خاطئ، يمكنك مراجعة الملف بعد المباراة. هذا ما نعنيه عندما الحديث عن البيانات المستمرة. في سياق تشغيل الخاص بك برنامج، يتم إنشاء الملف. وعندما برنامجك توقف تشغيل، هذا الملف لا يزال موجودا على النظام الخاص بك. ويمكننا أن ننظر في الأمر والنظر فيه. وهكذا سيتم تعيين هذا البرنامج ل خلقت بعض البيانات الثابتة، توجد بيانات بعد البرنامج انتهى قيد التشغيل. الآن كل هذه الوظائف التي عمل مع إنشاء الملفات والتلاعب لهم بطرق مختلفة يعيش في io.h القياسية، وهو ملف رأس من المحتمل أنك قد تم جنيه بما في ذلك في الجزء العلوي من جميلة الكثير كافة البرامج لأنه يحتوي على واحد من معظم وظائف مفيدة بالنسبة لنا، printf، الذي يتيح أيضا يعيش في io.h. القياسية لذلك لا تحتاج لقصف تشمل أي ملفات إضافية ربما من أجل العمل مع مؤشرات الملفات. الآن كل وظيفة مؤشر ملف واحد، أو كل ملف واحد I / O، المدخلات والمخرجات وظيفة، يقبل واحدة من معالمها أو المدخلات وpointer-- ملف باستثناء لأحد، والدالة fopen، التي ما كنت تستخدم للحصول على الملف المؤشر في المقام الأول. ولكن بعد أن كنت قد فتح ملف وتحصل على مؤشرات الملف، يمكنك ثم تمريرها كما الحجج لمختلف الوظائف ونحن في طريقنا للحديث عن اليوم، فضلا عن العديد من الآخرين بحيث يمكنك العمل مع الملفات. لذلك هناك ست جدا تلك الأساسية المشتركة أننا بصدد الحديث عنه اليوم. الدالة fopen وصاحبه وظيفة fclose، fgetc ولها وظيفة رفيق fputc، وfread وظيفة المرافق له، fwrite. لذلك دعونا الحصول على الحق في ذلك. fopen-- ماذا يفعل؟ كذلك، فإنه يفتح ملف و يعطيك مؤشر الملف إلى ذلك، بحيث يمكنك ثم استخدام ذلك ملف مؤشر كحجة إلى أي من الملفات الأخرى I ظائف / O. أهم شيء لنتذكر مع الدالة fopen وأنه بعد أن فتح ملف أو إجراء مكالمة مثل واحد هنا، تحتاج إلى التحقق للتأكد من أن المؤشر أنك حصلت على العودة لا يساوي قيمة خالية. إذا لم تكن قد شاهدت الفيديو على مؤشرات، وهذا قد لا يكون له معنى. ولكن إذا حاولت وdereference أذكر مؤشر فارغة، سوف برنامجك تعاني على الأرجح تجزئة (غير مسموع). نحن نريد أن نتأكد من أننا حصلت على العودة مؤشر المشروعة. الغالبية العظمى من الوقت ونحن وقد حصلت على مؤشر الشرعي العودة وأنه لن يكون هناك مشكلة. كيف لنا إذن أن إجراء مكالمة إلى FOPEN؟ يبدو الى حد كبير مثل هذا. نجمة ملف ptr-- PTR كونه عام اسم لملف pointer-- الدالة fopen ونحن نمر في أمرين، اسم ملف وعملية ونحن نريد القيام بها. لذلك قد يكون لدينا مكالمة يشبه this-- PTR نجمة ملف 1 يساوي الدالة fopen file1.txt. والعملية لقد اخترت هي ص. فما رأيك ص هنا؟ ما هي أنواع الأشياء التي قد تكون قادرة على القيام به لملفات؟ حتى r هي العملية التي نحن اختيار عندما نريد لقراءة الملف. لذلك فإننا في الأساس عندما نحن إجراء مكالمة من هذا القبيل يكون الحصول على أنفسنا مؤشر الملف بحيث يمكننا بعد ذلك يمكن قراءة المعلومات من file1.txt. وبالمثل، يمكن أن نفتح ملف 2.txt للكتابة وحتى نتمكن من تمرير ptr2، مؤشر الملف لقد خلق هنا، كحجة لأي وظيفة يكتب المعلومات إلى ملف. وعلى غرار الكتابة، هناك أيضا خيار لإلحاق، أ. الفرق بين الكتابة وإلحاق يجري ذلك عند الكتابة إلى ملف، إذا قمت بإجراء مكالمة لFOPEN للكتابة وهذا الملف موجود بالفعل، انها الذهاب إلى الكتابة فوق الملف بأكمله. انها سوف تبدأ في البداية، حذف جميع المعلومات هذا هو بالفعل هناك. في حين إذا كنت فتحه لإلحاق، وسوف تذهب إلى نهاية الملف إذا كان هناك بالفعل النص في أو المعلومات الواردة فيه، وانها ستبدأ ثم الكتابة من هناك. حتى أنك لن تخسر أي من معلومات كنت قد فعلت من قبل. إذا كنت ترغب في إرسال أو إلحاق نوع من يعتمد على الوضع. ولكن عليك ربما نعرف ما العملية الصحيحة هي عندما يحين الوقت. ولهذا FOPEN. ماذا عن fclose؟ حسنا، ببساطة جدا، fclose تقبل فقط مؤشر الملف. وكما قد تتوقع، فإنه يغلق هذا الملف. ومرة واحدة لقد أغلقت ملف، لا يمكننا أداء أي ملف أكثر I ظائف / O، القراءة أو الكتابة، على هذا الملف. علينا أن إعادة فتح ملف وقت آخر من أجل لمواصلة العمل مع باستخدام وظائف I / O. وسائل fclose حتى ننتهي العمل مع هذا الملف. وكل ما تحتاجه للمرور في غير اسم مؤشر الملف. لذلك على الزوجين قبل الشرائح، ونحن fopened ملف نصي 1 نقطة عن القراءة ونحن توكل ملف المؤشر إلى ptr1. الآن قررنا نحن فعل القراءة من هذا الملف. نحن لسنا بحاجة للقيام بأي أكثر معها. نستطيع ptr1 فقط fclose. وبالمثل، يمكن لنا fclose بعضها الآخر. حسنا. ذلك أن فتح وإغلاق. تلك هي الأساسية اثنين بدء العمليات. الآن نريد أن الواقع القيام ببعض الاشياء، والوظيفة الأولى التي سنقوم رؤية من شأنها أن تفعل هذا هو fgetc-- ملف الحصول على الحرف. هذا ما fgetc عموما سوف تترجم إلى. هدفه في الحياة هو أن قراءة الحرف التالي، أو إذا كان هذا هو كلماتكم النداء الأول للfgetc لملف معين، الحرف الأول. ولكن بعد ذلك بعد ذلك، يمكنك الحصول على واحدة المقبل، الحرف التالي للغاية من هذا الملف، ويخزنها في متغير حرف. كما فعلناه هنا، شار الفصل يساوي fgetc، تمرير باسم مؤشر الملف. مرة أخرى، انها جدا المهم هنا أن نتذكر أنه من أجل أن يكون هذه العملية تنجح، مؤشر الملف نفسه يجب أن كنت تم فتح للقراءة. لا يمكننا قراءة حرف من ملف المؤشر الذي فتحنا للكتابة. حتى أن واحدة من القيود المفروضة على الدالة fopen، أليس كذلك؟ علينا أن تقيد أنفسنا لأداء فقط عملية واحدة مع مؤشر ملف واحد. إذا أردنا أن القراءة و الكتابة من نفس الملف، سيكون لدينا مفتوحة منفصلين مؤشرات الملف إلى نفس الملف-- واحدة للقراءة، واحد للكتابة. ذلك مرة أخرى، والسبب الوحيد أحمل حتى الآن هو أن لأنه إذا نحن في طريقنا لإجراء مكالمة لfgetc، التي انا يجب مؤشر الملف تم فتح للقراءة. ثم ببساطة جدا، كل ما عليك القيام به هو تمرير باسم مؤشر الملف. ذلك الفصل شار يساوي ptr1 fgetc. وهذا ما سوف يحصل لنا وcharacter-- المقبل أو مرة أخرى، إذا كان هذا هو أول الوقت حققنا هذه الدعوة، وcharacter-- أولا من كل ما وأشار الملف إلى قبل ptr1. أذكر أن ذلك كان ملف 1 نقطة النص. ستحصل على الحرف الأول من ذلك وسنقوم بتخزينها في الفصل متغير. جميلة واضحة. ولذا فإننا قد بحثت فقط في ثلاث وظائف وبالفعل نحن تستطيع ان تفعل شيئا أنيق جدا. لذلك إذا أخذنا هذه القدرة للحصول على شخصية ونحن حلقة it-- لذلك نحن الاستمرار في الحصول على الأحرف من ملف مرارا و مرارا وover-- نحن الآن يمكن قراءة كل واحد طابع الملف. وإذا كان لنا أن طباعة كل حرف على الفور بعد القراءة، قرأناه الآن من ملف و طبعت محتوياته على الشاشة. لقد متصلا على نحو فعال هذا الملف على الشاشة. وهذا ما ل القيادة لينكس القط لا. إذا قمت بكتابة القط في اسم الملف، سوف طباعة محتويات الملف في نافذة المحطة الطرفية. وحتى هذه الحلقة قليلا هنا، ثلاثة أسطر فقط من التعليمات البرمجية، ولكنها مكررة على نحو فعال القط الأوامر لينكس. حتى يمكن بناء الجملة هذا تبدو غريبة بعض الشيء، ولكن هنا ما يحدث هنا. حين الفصل يساوي fgetc، PTR ليس يساوي EOF-- انها الفم كله، ولكن دعونا كسرها نزولا فقط لذلك فمن الواضح في بناء الجملة. لقد عزز ذلك من أجل الفضاء، على الرغم من انها قليلا صعبة التركيب. حتى هذا الجزء في حق الأخضر الآن، ما هو يفعل؟ حسنا، هذا مجرد دعوة fgetc لدينا، أليس كذلك؟ لقد رأينا ذلك من قبل. انها واحدة الحصول على حرف من الملف. ثم نقارن ذلك شخصية ضد EOF. EOF هو قيمة خاصة هذا المعرفة في io.h القياسية، التي هو حرف نهاية الملف. وذلك أساسا ما الذي سيحدث وهذه الحلقة سوف تقرأ حرف، مقارنته الفولكلوري، و حرف نهاية الملف. إذا كانت لا تطابق، لذلك ليس لدينا وصلت إلى نهاية الملف، سنقوم بطباعة هذا الطابع بها. ثم سنذهب إلى بداية الحلقة مرة أخرى. وسوف نحصل على حرف، وتحقق ضد EOF، وطباعته، وهلم جرا وهلم جرا وهلم جرا، حلقات عبر بهذه الطريقة حتى أننا قد وصلنا إلى نهاية الملف. ومن ثم من قبل تلك النقطة، سيكون لدينا المطبوعة من محتويات الملف. ذلك مرة أخرى، شاهدنا فقط الدالة fopen، fclose، وfgetc وبالفعل يمكننا مكررة أمر لينكس المحطة. وكما قلت في البداية، كان لدينا fgetc وfputc، وكان fputc الرفيق وظيفة من fgetc. وهكذا، كما قد يتصور، ذلك هو ما يعادل الكتابة. لأنها تتيح لنا لكتابة حرف واحد إلى ملف. مرة أخرى، التحذير الحالي، فقط مثل ما كان مع fgetc، الملف اننا الكتابة لانا يجب تكن فتح باب الكتابة أو إلحاق. إذا حاولنا واستخدام fputc على ملف أننا قد فتحت للقراءة، ونحن في طريقنا للمعاناة قليلا من الخطأ. لكن الدعوة بسيطة جدا. العاصمة fputc A ptr2، كل وهذا ما تنوي القيام به هو انها أريد أن أكتب هذه الرسالة إلى A في ملف 2 نقطة النص، الذي كان اسم الملف الذي فتحنا وتعيين المؤشر إلى ptr2. لذلك نحن ذاهبون لكتابة العاصمة A إلى ملف 2 نقطة النص. وسنقوم إرسال تعجب أشر إلى ملف 3 نقطة النص الذي أشار إليه ptr3. ذلك مرة أخرى، واضحة جدا هنا. ولكن الآن يمكننا أن نفعل شيئا آخر. لدينا هذا المثال كنا مجرد الذهاب على عن كونها قادرة على تكرار القط القيادة لينكس، تلك التي تطبع إلى الشاشة. حسنا، الآن أن لدينا القدرة لقراءة الأحرف من الملفات وكتابة الأحرف إلى الملفات لماذا لا يتم فقط استبدال ذلك الدعوة إلى printf مع دعوة fputc. والآن لدينا ازدواجية حزب المحافظين، أمر أساسي جدا لينكس أن تحدثنا عن الطريق طويل قبل في لينكس أوامر الفيديو. قمنا بفعالية تكرار هذا الحق هنا. نحن قراءة حرف ثم نحن كتابة هذا الحرف إلى ملف آخر. القراءة من ملف واحد، والكتابة إلى آخر، وعلى مدى أكثر وتكرارا حتى ضربنا EOF. لقد وصلنا إلى نهاية ملف نحاول نسخ منها. وبذلك سنكون قد كتابة جميع من الشخصيات نحتاج إلى ملف اننا الكتابة ل. لذلك هذا هو حزب المحافظين، الأمر نسخة لينكس. في بداية هذا الفيديو، كان التحذير أننا سوف نتحدث قليلا عن المؤشرات. هنا هو على وجه التحديد حيث نحن بصدد الحديث عن مؤشرات بالإضافة إلى تقديم مؤشرات. حتى هذه المهمة تبدو مخيف. انها حصلت على العديد من المعلمات. هناك الكثير مما يجري هنا. هناك الكثير من مختلف الألوان والنصوص. ولكن في الحقيقة، انها مجرد إصدار عام fgetc تسمح لنا للحصول على أي كمية المعلومات. يمكن أن تكون غير فعالة قليلا إذا نحن الحصول على حرف واحد في وقت واحد، بالتكرار عبر ملف حرف واحد في وقت واحد. لن يكون أجمل للحصول على 100 في وقت واحد أو 500 في وقت واحد؟ حسنا، fread وظيفة المرافق له fwrite، والتي سوف نتحدث عن في الثانية، تسمح لنا لفعل ذلك. يمكننا أن نقرأ مبلغ التعسفي المعلومات من ملف ونحن تخزينه في مكان ما بشكل مؤقت. بدلا من أن تكون قادرة على مجرد أنها تناسب في متغير واحد، أننا قد نحتاج إلى تخزينها في صفيف. وهكذا، نحن نمر في أربعة الحجج لfread-- مؤشر إلى الموقع حيث نحن الذهاب لتخزين المعلومات، كيف كبيرة كل وحدة المعلومات سوف يكون، وكيف العديد من وحدات المعلومات نريد للحصول على، ومن الملف الذي نريد للحصول عليها. ربما أفضل مثال مع مثال هنا. لذلك دعونا نقول أن نعلن مجموعة من 10 الأعداد الصحيحة. لقد أعلنت للتو على كومة تعسفا كثافة العمليات آر 10. ذلك أن واضحة جدا. الآن ما نقوم به على الرغم من هو frecall وإننا نقرأ حجم كثافة العمليات مرات 10 بايت من المعلومات. حجم كثافة الوجود four-- هذا حجم عدد صحيح في ج. فما نقوم به هو أننا القراءة 40 بايت بقيمة المعلومات من الملف المشار إليه بواسطة PTR. ونحن تخزين تلك 40 بايت في مكان ما حيث وضعنا جانبا 40 بايت بقيمة الذاكرة. لحسن الحظ، لقد فعلت ذلك من قبل إعلان آر، أن مجموعة هناك. هذا هو قادر على عقد 10 وحدة أربعة بايت. حتى في المجموع، يمكن أن تعقد 40 بايت بقيمة المعلومات. ونحن نقرأ الآن 40 بايت المعلومات من الملف، ونحن تخزينه في آر. أذكر من الفيديو على المؤشرات التي اسم صفيف، مثل آر، هو في الحقيقة مجرد مؤشر لأول عنصرها. لذلك عندما نمر في آر هناك، ونحن هي، في الواقع، ويمر في المؤشر. وبالمثل يمكننا القيام به this-- نقوم به ليس بالضرورة تحتاج إلى حفظ عازلة لدينا على المكدس. يمكننا أيضا تخصيص حيوي منطقة عازلة مثل هذا، وذلك باستخدام malloc. تذكر عندما كنا حيوي تخصيص الذاكرة، نحن حفظه على كومة، وليس المكدس. لكنه ما زال عازلة. لا يزال، في هذه الحالة، عقد 640 بايت من المعلومات لأن ضعف يستغرق ثمانية بايت. ونطلبه 80 منهم. نحن نريد أن يكون الفضاء عقد 80 الزوجي. حتى 80 مرة 8 هي المعلومات 640 بايت. وهذا النداء إلى fread هي جمع 640 بايت من المعلومات من أشار الملف من قبل PTR وتخزينه الآن في arr2. الآن يمكننا أيضا علاج fread تماما مثل الدعوة إلى fgetc. في هذه الحالة، نحن مجرد محاولة ل الحصول على حرف واحد من الملف. ونحن لا نحتاج إلى مجموعة لعقد الطابع. يمكننا فقط تخزينه في متغير حرف. الصيد، على الرغم من أن عندما يكون لدينا مجرد متغير، نحن بحاجة إلى تمرير في عنوان هذا المتغير لنتذكر أن الحجة الأولى لfread هو مؤشر إلى الموقع والذاكرة حيث نريد لتخزين المعلومات. مرة أخرى، اسم ل مجموعة هي المؤشر. لذلك نحن لسنا في حاجة للقيام مجموعة علامة العطف. ولكن ج، والطابع ج هنا، ليس صفيف. انها مجرد متغير. ولذا فإننا بحاجة إلى تمرير ج العطف للإشارة أن هذا هو العنوان الذي نريد لتخزين هذه بايت واحد من المعلومات، هذا حرف واحد أن نحن جمع من PTR. Fwrite-- سأذهب من خلال المزيد من هذا قليلا quickly-- هي جميلة كثيرا أي ما يعادل الدقيق للfread إلا انها للكتابة بدلا من القراءة، فقط مثل other-- لقد كان مفتوحا وعلى مقربة، والحصول على حرف، كتابة حرف. الآن انها تحصل التعسفي كمية المعلومات، كمية التعسفي الأيمن من المعلومات. تماما مثل ذلك من قبل، ما في وسعنا لدينا مجموعة من 10 الأعداد الصحيحة حيث لدينا بالفعل المعلومات المخزنة، ربما. ربما كان بعض الأسطر من التعليمات البرمجية كان يجب أن تدخل بين هذين حيث أنا ملء آر مع شيء مفيد. I ملء مع 10 الأعداد الصحيحة مختلفة. وبدلا من ذلك، ما أنا به هو كتابة من آر وجمع المعلومات من آر. وأنا أخذ هذه المعلومات ووضعه في ملف. وذلك بدلا من كونها من الملف إلى المخزن المؤقت، ونحن في طريقنا الآن من المخزن المؤقت للملف. حتى انها مجرد العكس. ذلك مرة أخرى، تماما مثل قبل، يمكننا لدينا أيضا قسما كومة من الذاكرة بعد أن قمنا حيوي خصصت وقراءة من ذلك وإرسال ذلك إلى الملف. وايضا لدينا متغير واحد قادرة على اجراء بايت واحد من المعلومات، مثل حرف. ولكن مرة أخرى، ونحن بحاجة لتمرير في عنوان هذا المتغير عندما نريد أن القراءة منه. حتى نتمكن من إرسال المعلومات نجد في هذا العنوان لمؤشر الملف، PTR. هناك الكثير من الآخر ملف كبير أنا وظائف / O أن تفعل أشياء مختلفة إلى جانب تلك التي تحدثنا عنها اليوم. زوجان من تلك قد تجدها مفيدة هي fgets وfputs، وهي ما يعادل من fgetc وfputc لكن لقراءة سلسلة واحدة من ملف. بدلا من حرف واحد، فإنه سيتم قراءة السلسلة بأكملها. fprintf، والذي يسمح أساسا لك استخدام printf الكتابة إلى ملف. حتى مثلك يمكن أن تفعل استبدال متغير باستخدام ط النائبة في المئة و د في المئة، وهلم جرا، مع printf يمكنك كذلك اتخاذ سلسلة printf والطباعة شيء من هذا القبيل إلى ملف. fseek-- إذا كان لديك جهاز دي في دي هو القياس وعادة ما تستخدم here-- هو نوع من مثل استخدام الخاص بك الترجيع وسريعة إلى الأمام أزرار للتنقل الفيلم. وبالمثل، يمكنك التحرك في جميع أنحاء الملف. واحدة من الأشياء داخل أن بنية الملف ج أن يخلق لك هو مؤشر من أين أنت في الملف. أنت في غاية ابتداء من الساعة صفر بايت،؟ هل أنت في البايت 100، بايت 1000، وهلم جرا؟ يمكنك استخدام fseek للتحرك بشكل تعسفي هذا المؤشر إلى الأمام أو الخلف. وftell، مرة أخرى على غرار لاعب دي في دي، هو مثل قليلا من ساعة ليقول لكم كم الدقائق والثواني لك هم في فيلم معين. وبالمثل، ftell يخبرك العديد من وحدات البايت كنت في الملف. feof هو نسخة مختلفة للكشف عما إذا كنت قد وصلت إلى نهاية الملف. وferror هي وظيفة التي يمكنك استخدامها لاكتشاف ما إذا كان شيء ما ذهبت عمل خاطئ مع ملف. مرة أخرى، وهذا هو فقط خدش السطح. لا يزال هناك الكثير أكثر ملف I / O وظائف في io.h. القياسية ولكن هذا ربما تحصل بدأت العمل مع مؤشرات الملفات. أنا دوغ ويد. هذا هو cs50.