>> [عزف الموسيقى]
>> ZAMYLA تشان: دعونا معالجة استرداد.
استرداد بلدي هو على الارجح PSET المفضلة، ويرجع ذلك أساسا أعتقد أنه من
حقا، حقا بارد.
في الأساس، وأنت أعطيت الذاكرة ملف البطاقة التي
تم حذف الصور.
ولكن ماذا كنت تريد الذهاب ل القيام به هو استعادة كل منهم.
>> موافق.
لذلك فمن المثير حقا، ولكن ربما تخويف قليلا، لأنك
نظرا ملف C فارغة و لديك لملء فيها.
موافق، لذلك دعونا كسر هذه إلى أجزاء يمكن التحكم فيها.
فأنت تريد لفتح ملف بطاقة الذاكرة.
الذي يبدو بسيطا بما فيه الكفاية.
ثم، والعثور على بداية من صورة JPG.
جميع الملفات الموجودة على هذه الذاكرة بطاقة ستكون JPGS.
ثم، وعندما تجد بداية، وأنت تسير لفتح JPG الجديدة، التي
هو، مثل، إنشاء JPG، وإرسال 512 بايت في وقت حتى JPG الجديد
وجدت، ووضع حد للبرنامج، مرة واحدة كنت كشف عن نهاية الملف.
>> الخطوات الأولى لذلك الأول هو لفتح ملف بطاقة الذاكرة.
ولكن هل تعرف هذا فعلا، وليس هناك ملف I / O وظيفة أن يحدث ل
تكون مفيدة جدا.
موافق.
فما هي JPGS؟
لأننا في حاجة إلى بداية ذلك.
حسنا، JPGS، تماما مثل خرائط قليلا، هي مجرد تسلسل بايت.
لحسن الحظ، يبدأ كل JPG مع أي عشرية 0xFF، 0xd8، عشرية 0xFF، 0xe0، سلسلة واحدة
من بايت، أو آخر تسلسل بايت.
>> حتى أولئك بايت أربعة تشير بداية JPG.
سوى تلك المجموعات اثنين أربعة بايت.
ولحسن الحظ بالنسبة لنا، وحقيقة أخرى أننا يمكن الاستفادة من هي أن كل
يتم تخزين JPG جنبا إلى جنب على بطاقة الذاكرة.
لقد مثلت بنية بطاقة الذاكرة تخطيطي على هذا
الشريحة هنا.
هنا، في كل مربع، كل مستطيل، يمثل 512 بايت، ويبدأ
مع الرمادي في أننا لا لديها حقا JPG.
>> ولكن بعد ذلك نحن ضرب أخيرا كتلة مع نجم.
وهذا يعني أن وحدات البايت الأربعة الأولى من تلك هي واحدة من 512 هذين
بدءا من تسلسل JPG.
ونذهب من هناك، ثم مرة واحدة JPG واحد ينتهي، يبدأ واحد القادم.
ليس لدينا أي وقت مضى أي أكثر الفضاء الرمادي في ما بينهما.
>> ولكن كيف نقرأ هذا الواقع، و قراءة بايت 512 حتى نتمكن من جعل
المقارنة المقام الأول؟
حسنا، دعونا نعود إلى fread، التي يأخذ في البنية التي سوف تحتوي على
وحدات البايت التي كنت تقرأ.
حتى وأنت تسير لوضع تلك في هناك -
حجم، عدد، ثم inpointer ان كنت تقرأ من.
الآن، ونحن نريد لقراءة 512 في وقت واحد، و نحن نريد لتخزين هذه في منطقة عازلة،
أنا ذاهب إلى نسميها.
>> في الأساس، ونحن في طريقنا لعقد على تلك بايت 512 والقيام
الأمور معها، أليس كذلك؟
نحن إما ذاهب لمقارنة الأولى أربعة بايت، أو نحن في طريقنا لل
قراءة في، موافق؟
حتى ذلك الحين سوف مؤشر البيانات ثم بمثابة المخزن المؤقت الخاص بك، و
inpointer، حسنا، هذا مجرد الذهاب أن تكون بطاقة الذاكرة الخاصة بك.
>> دعم لبطاقة الذاكرة لدينا التخطيطي.
ونحن في طريقنا إلى قراءة 512 بايت في كل مرة، تخزين كل كتلة 512 بايت
في المخزن مؤقت، وعقد على تلك العازلة، تلك بايت 512، حتى ونحن نعلم
بالضبط ما يجب القيام به لهم.
حتى بداية ليس أي شيء، لذلك سنقوم قراءة العازلة، مقارنتها، و
نحن لن تحتاج إلى القيام بأي شيء معها.
وبعد ذلك، ونحن في النهاية ضرب نجم منع، وهذا يعني أن لدينا
العثور على أول JPG لدينا.
وبالتالي فإن عقد العازلة الآن بايت من أن JPG.
>> في المرة القادمة 512 بايت، لأنهم ليس كتلة النجم، هي أيضا
جزء من تلك JPG.
وJPGS مستمرة من هناك على في، إلى أن تصل إلى JPG المقبل.
ثم المخزن المؤقت ثم يحمل 512 بايت لذلك JPG، و
هلم جرا، وهكذا دواليك.
موافق.
>> وذلك بمجرد ضرب أول نجمة كتلة، أول JPG، كيف
في الواقع، حسنا، فتحه؟
دعونا جعل JPG جديدة.
أسماء الملفات لJPG ذاهبون ل يكون في الشكل، العدد، العدد،
number.jpg، في انهم وردت أسماؤهم في الترتيب الذي وجدوا،
ابتداء من الساعة 0.
>> وبالتالي فإن JPG الأولى التي تقوم فيها سيتم 000.JPG العثور عليها.
لذلك، ربما يكون فكرة جيدة للحفاظ على المسار كيف العديد من JPGS كنت قد وجدت حتى الآن.
لذلك هذا هو اسم الملف.
ولكن كيف يمكن في الواقع جعل ذلك؟
حسنا، نحن ذاهبون الى استخدام وظيفة تسمى sprintf.
قليلا مماثلة لprintf، حيث يمكنك استخدام العناصر النائبة عن سلاسل،
إلا في هذه الحالة، سوف sprintf طباعة ملف للخروج الى التيار
الدليل، وليس في المحطة.
>> موافق.
حتى هنا نرى أن لدينا العنوان، مجموعة شار الذي سيخزن
السلسلة الناتجة، ونحن نمر في عنوان السلسلة الفعلية مع
نائب، مثلما كنا تعلمت أن تفعل مع printf.
ولكن هذا الرمز أن لدي هنا سيعطي 2.JPG، وليس 002.JPG.
لذلك سأترك لكم لمعرفة كيفية تعديل نائبا لجعل
الاسم الصحيح.
>> موافق.
ذلك مرة واحدة كنت قد sprintf'd ثم يمكنك فتح هذا الملف، لأنه موجود في
الدليل الخاص بك، مع الدالة fopen، وذلك باستخدام العنوان، ثم وضع كل ما تريد
لفتح هذا الملف فيه.
وحتى الآن بعد أن قمنا فتح ملف JPG جديدة، الآن يمكن أن نكتب 512 بايت في
الوقت، حتى يتم العثور على JPG جديدة.
لذلك دعونا نلقي نظرة أخرى في بناء جملة fwrite.
>> وأنا أعلم أنني تظهر هذه الشريحة ل الكثير، ولكن أريد فقط للتأكد من أن
يا رفاق لا يحصل الخلط جدا، لأن وأنا أعلم أنه من السهل جدا ل
خلط الأول والأخير حجة، على وجه الخصوص.
ولكن تذكر أن كنت تكتب من العازلة الخاص بك إلى ملف الصور بها.
>> الآن بعد أن تعرف كيف الكتابة 512 بايت في ملف JPG الخاص بك الذي كنت قد
خلق، حسنا، نحن نريد أن يتوقفوا عن هذه العملية مرة واحدة أننا وصلنا إلى نهاية
بطاقة لدينا، لأنه لن يكون هناك أي مزيد من الصور التي يمكن العثور عليها.
لذلك دعونا نعود إلى fread مرة أخرى، وأعدكم.
fread إرجاع عدد العناصر الحجم، الحجم، وكانوا على استعداد في بنجاح.
من الناحية المثالية، وهذا سيكون مهما يمكنك تمرير لفي العدد، أليس كذلك؟
لأنك تحاول قراءة عدد عناصر الحجم، الحجم.
ولكن إذا fread ليست قادرة على قراءة ذلك عدد من العناصر، ثم أنها سوف العودة
أيا كان عدد قراءتها بنجاح.
>> الآن، هناك شيء واحد مهم هو أن نلاحظ أنه إذا كنت تستخدم ملف آخر I / O
وظيفة مثل fgetc، فإنه سوف يعود أيضا كيف العديد من العناصر قراءتها بنجاح.
ما هو مفيد حول هذه الوظيفة أنه إذا كنت تستخدم وظائف داخل ل
حالة، وأنها سوف تنفذ نفسها حين تحديد هذا الشرط، الذي هو
فقط مفيدة حقا.
حتى إذا كان لديك هذه الشروط، مثلا، إذا العازلة fread، DOG sizeof، 2،
المؤشر، يساوي يساوي 1، التي يعني ان كنت ترغب في قراءة
2 الكلاب في ذلك الوقت.
ولكن إذا fread بإرجاع 1 بدلا من 2 كما المتوقع، وهذا يعني أن هناك 2
الكلاب اليسار في الملف الخاص بي، وإنما 1.
ولكن اذا عاد 2، ثم لا يزال لدي تلك الكلاب 2 داخل بلدي العازلة.
>> وحتى الآن والتي تمنحك شعورا كيفية تحقق لنهاية الملف، ولكن
دعنا نذهب الآن من خلال المنطق.
كيف يمكننا في الواقع قطعة جميع من هذه العناصر معا؟
بمجرد أن تصل أول JPG لدينا، منذ ونحن نعلم أن JPGS يتم تخزين
متاخم، سنكون الكتابة حتى نصل إلى نهاية الملف البطاقة.
لكننا لا تريد أن تكتب أي شيء حتى ذلك الحين.
لذلك يهم، ليس فقط أننا في بداية JPG جديدة، ولكن ما إذا كان
لقد وجدنا بالفعل JPG أو لا.
>> إذا انها بداية جديدة JPG، سنقوم تريد إغلاق ملف JPG الحالي إذا لدينا
لدينا واحدة مفتوحة، ومفتوحة واحدة جديدة لكتابة فيه.
إذا لم يكن بداية جديدة JPG، رغم ذلك، سنستمر في ملف JPG نفسه
فتح والكتابة في ذلك.
سنقوم إرسال عازلة لدينا في أيهما ملف JPG لدينا مفتوحة، شريطة أن
لدينا واحدة مفتوحة، بطبيعة الحال.
إذا لم نجد أول JPG لدينا حتى الآن، ونحن لا تكتب أي شيء.
وتستمر هذه العملية حتى تقوم الوصول إلى نهاية الملف البطاقة.
>> وأخيرا، فأنت تريد أن تجعل متأكد أنك fclose أي
الملفات التي كنت قد fopened.
مرة كنت مرتاحا مع المفاهيم، نلقي نظرة على بعض
شبة الكود، والتي لقد شملت هنا.
أولا، تريد فتح ملف البطاقة، ثم كرر العملية التالية
حتى كنت قد وصلت إلى نهاية البطاقة.
كنت ترغب في قراءة 512 بايت في المخزن مؤقت.
استخدام هذا المخزن المؤقت، فأنت تريد أن تحقق سواء كنت في بداية
JPG جديدة أم لا.
والجواب على هذا السؤال سوف تؤثر إدارة الملفات الخاصة بك -
الملفات التي تفتحها، والتي منها هل إغلاقه.
>> ثم، هل وجدت بالفعل JPG؟
كيف هل تم حفظ المسار من ذلك؟
ثم، وهذا يتوقف على ذلك، عليك إما إرسال إلى JPG الحالية التي
لديهم مفتوحة، أو لا يكتب ذلك على الإطلاق، لأنك لا يمكن العثور على JPG حتى الآن.
أخيرا، مرة واحدة كنت قد وصلت إلى نهاية ملف، فأنت تريد أن إغلاق أي
تبقى الملفات التي قمت بفتحها.
نحن نريد أن تكون مرتبة هنا.
>> ومع ذلك، كنت قد تعافى كل من الملفات المفقودة من تلك الذاكرة
بطاقة، وهو الانجاز مدهشا.
حتى بات نفسك على ظهره.
ولكن، هناك عنصر واحد أكثر ل وPSET، وهي المسابقة.
ستجد أن جميع الصور بعد أن كنت قد تعافى هي في الواقع
صور من الموظفين في CS50.
حتى إذا كنت في الحرم الجامعي أو في مكان ما القريب، ثم يمكنك أن تأخذ الصور مع
الموظفين، والقسم الذي يحتوي على معظم الصور مع الموظفين
من ملفاتهم تعافى سوف الحصول على جائزة رهيبة.
مع ذلك، ثم الانتهاء لاستعادة PSET.
اسمي Zamyla، وهذا هو CS50.