>> [השמעת מוסיקה]
>> ZAMYLA צ'אן: בואו להתמודד להתאושש.
שחזור הוא כנראה PSET האהוב עליי, ובעיקר משום שאני חושב שזה
ממש, ממש מגניב.
בעיקרון, אתה נתון זיכרון כרטסת שבי
תמונות נמחקו.
אבל מה אתה הולך לעשות הוא לשחזר את כולם.
>> על אישור.
אז זה באמת מרגש, אבל אולי קצת מפחיד, כי אתה
ניתנה קובץ C ריק ו אתה צריך למלא אותו פנימה
אוקיי, אז בואו לשבור את זה לחלקים לניהול.
אתה רוצה לפתוח את קובץ לכרטיס זיכרון.
זה נראה די פשוט.
לאחר מכן, למצוא את תחילת של תמונה מסוג JPG.
כל הקבצים בזיכרון הזה כרטיס הולך להיות jpgs.
ואז, ברגע שאתה מוצא את ההתחלה, אתה הולך לפתוח JPG חדש, כי
הוא, כמו, ליצור JPG, ולכתוב 512 בתים בכל פעם עד JPG חדש הוא
נמצא, וסיום התכנית, ברגע לך לזהות סוף הקובץ.
>> צעדים אז הראשונים הוא ראשון שפתחו את הקובץ לכרטיס זיכרון.
אבל אתה יודע את זה כבר, ויש פונקצית קלט / פלט קובץ שהולכת
להיות שימושי מאוד.
על אישור.
אז מה הם jpgs?
כי אנחנו צריכים את תחילתו.
ובכן, jpgs, בדיוק כמו מפות סיביות, הם רק רצפים של בתים.
למרבה המזל, כל JPG מתחיל עם או 0xFF, 0xd8, 0xFF, 0xe0, רצף אחד
של בתים, או אחר רצף של בתים.
>> אז ארבעת בתים אלה מצביעים תחילתו של JPG.
לא אחרים מאשר שני שילובים אלה של ארבעה בתים.
ומזלנו, עובדה נוספת שאנו יכול לנצל הוא שכל
JPG מאוחסן Side-by-צד בכרטיס הזיכרון.
אני ייצגתי את המבנה כרטיס זיכרון באופן סכמטי על זה
להחליק כאן.
כאן, בכל כיכר, בכל מלבן, מייצג 512 בתים, וזה מתחיל
עם אפור שבאנחנו לא באמת יש לי JPG.
>> אבל אז אנחנו סוף סוף פגעו בלוק עם כוכב.
זה אומר שארבעה הבתים הראשונים מתוך של אלה 512 הם אחד משני אלה
החל רצפים של JPG.
ואנחנו הולכים משם, ואז ברגע JPG אחד מסתיים, הבא מתחיל.
אנחנו לא אי פעם יש יותר שטח אפור שביניהם.
>> אבל איך אנחנו באמת קוראים את זה, ו לקרוא את 512 בתים, כך שנוכל לעשות
ההשוואה במקום הראשון?
ובכן, בואו נחזור לfread, אשר לוקח בstruct שיכיל
הבתים שאתה קורא.
אז אתה הולך לשים אלה שביש -
הגודל, המספר, ולאחר מכן 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, כלב sizeof, 2,
מצביע, שווה שווה 1, כי אומר שהייתי רוצה לקרוא
2 כלבים באותו הזמן.
אבל אם fread מחזירה 1 במקום 2 כמו צפוי, זה אומר שיש 2
כלבים שנשארו בתיק שלי, אלא 1.
אבל אם היא מחזירה 2, אז עדיין יש לי 2 כלבים אלה בתוך החיץ שלי.
>> אז עכשיו שנותן לך תחושה של איך לבדוק לסוף הקובץ, אבל
בואו נעבור עכשיו לוגיקה.
איך אנחנו באמת חתיכה כל האלמנטים האלה יחד?
ברגע שנתחיל JPG הראשון שלנו, שכן אנו יודעים כי jpgs מאוחסנים
בסמיכות, יהיה לנו לכתוב עד אנחנו מגיעים לסוף קובץ הכרטיס.
אבל אנחנו לא רוצים לכתוב שום דבר עד אז.
אז זה לא חשוב, לא רק שאנחנו ב תחילת JPG חדש, אבל אם
אנחנו כבר מצאנו JPG או לא.
>> אם זה ההתחלה של JPG חדש, יצטרכו רוצה לסגור את קובץ JPG הנוכחי שלנו, אם
יש לנו אחד פתוחה, ופתוח אחד חדש לכתוב ל.
אם זה לא ההתחלה של JPG החדש, אם כי, אנחנו נשמור את אותו קובץ JPG
לפתוח ולכתוב לזה.
אנחנו נכתוב החיץ שלנו לתוך לפי קובץ JPG יש לנו פתוח, ובלבד ש
יש לנו אחד פתוח, כמובן.
אם לא מצאנו JPG הראשון שלנו עדיין, אנחנו לא כותבים כלום.
והתהליך הזה ממשיך עד שאתה להגיע לסוף של קובץ הכרטיס.
>> ולבסוף, אתה רוצה לעשות בטוח שאתה fclose כל
קבצים שיש לך fopened.
ברגע שאתה מרגיש בנוח עם מושגים, להעיף מבט על כמה
pseudocode, שצרפתי כאן.
ראשית, אתה רוצה לפתוח את קובץ הכרטיס, ולאחר מכן לחזור על התהליך הבא
עד שהגעת הסוף של הכרטיס.
אתה רוצה לקרוא 512 בתים לחיץ.
באמצעות מאגר זה, אתה רוצה לבדוק בין אם אתה בתחילת
JPG או לא חדשים.
והתשובה לשאלה זו תהיה משפיע על ניהול הקבצים שלך -
אילו קבצים אתה פותח, אשר אלה שאתה סוגר.
>> ואז, יש לך כבר מצא JPG?
איך יש לך כבר שמירה אחר ש?
לאחר מכן, בהתאם לכך, אתה גם יהיה לכתוב לתוך JPG הנוכחי שאתה
יש לי פתוח, או לא לכתוב את זה בכלל, בגלל שאתה לא מצאת JPG עדיין.
לבסוף, לאחר שהגעת לסוף את הקובץ, תרצה כדי לסגור את כל
נותר קבצים שיש לך פתוח.
אנחנו רוצים להיות מסודרים כאן.
>> ועם זה, יש לך התאושש כל קבצים החסרים מזיכרון כי
כרטיס, שהוא הישג די מדהים.
אז לטפוח לעצמך על שכם.
אבל, יש אלמנט אחד ל PSET, המהווה את התחרות.
אתה תמצא שכל התמונות כי אתה כבר התאושש למעשה
תמונות של צוות של CS50.
אז אם אתה בקמפוס או במקום קרוב, אז אתה יכול לצלם תמונות עם
צוות, והחלק שיש לו את רוב התמונות עם חברי צוות
מהקבצים שנמצאו יהיה תקבל הפרס מדהים.
עם זה, אז אתה כבר סיימת לשחזר PSET.
השם שלי הוא Zamyla, וזה CS50.