[เล่นดนตรี] 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 ไบต์และทำ สิ่งที่มีมันใช่มั้ย อย่างใดอย่างหนึ่งที่เรากำลังจะไปเปรียบเทียบแรก สี่ไบต์หรือเรากำลังจะ อ่านมันใน OK? ดังนั้นแล้วตัวชี้ข้อมูลจะแล้ว ทำหน้าที่เป็นกันชนของคุณและ inpointer ดีที่เพิ่งจะ เป็นการ์ดหน่วยความจำของคุณ กลับไปที่แผนผังการ์ดหน่วยความจำของเรา เรากำลังจะไปอ่าน 512 ไบต์ในแต่ละครั้ง การจัดเก็บทุกบล็อก 512 ไบต์ เป็นกันชนถือไปยังผู้ที่ buffer ผู้ 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 เมื่อคุณพอใจกับ แนวความคิดที่จะดูที่บางส่วน pseudocode ซึ่งฉันได้รวมอยู่ที่นี่ ขั้นแรกคุณต้องการเปิดแฟ้มบัตร แล้วทำซ้ำขั้นตอนต่อไปนี้ จนกว่าคุณจะได้ถึง ในตอนท้ายของบัตร คุณต้องการอ่าน 512 ไบต์ เป็นกันชน การใช้บัฟเฟอร์ที่คุณจะต้องการที่จะตรวจสอบ ไม่ว่าคุณจะอยู่ที่จุดเริ่มต้นของ JPG ใหม่หรือไม่ และคำตอบสำหรับคำถามที่จะ ส่งผลกระทบต่อการจัดการไฟล์ของคุณ - ซึ่งไฟล์ที่คุณเปิดที่ คนที่คุณจะปิด จากนั้นมีคุณแล้วพบ JPG? ท่านได้รับการรักษา ติดตามที่ จากนั้นขึ้นอยู่กับว่าคุณอาจจะ เขียนลงใน JPG ปัจจุบันที่คุณ เปิดหรือไม่เขียนมันเลย เพราะคุณไม่ได้พบ JPG ยัง สุดท้ายเมื่อคุณได้มาถึงจุดสิ้นสุดของ ไฟล์ที่คุณจะต้องการที่จะปิดการใด ๆ ไฟล์ที่เหลือที่คุณต้องเปิด เราต้องการที่จะเป็นระเบียบเรียบร้อยที่นี่ และมีที่คุณได้กู้คืนทั้งหมด ไฟล์หายไปจากความทรงจำที่ การ์ดซึ่งเป็นเพลงน่ารัก ดังนั้นตัวเองตบเบา ๆ ที่ด้านหลัง แต่มีองค์ประกอบหนึ่งที่จะ pset ซึ่งเป็นการประกวด คุณจะพบว่ารูปภาพทั้งหมด ที่คุณได้กู้คืนเป็นจริง ภาพของพนักงาน CS50 ของ ดังนั้นถ้าคุณอยู่ในมหาวิทยาลัยหรือที่ใดที่หนึ่ง ใกล้แล้วคุณสามารถถ่ายภาพด้วย พนักงานและส่วนที่มี ภาพส่วนใหญ่ที่มีพนักงาน จากไฟล์ที่กู้คืนของพวกเขาจะ ได้รับรางวัลที่น่ากลัว กับที่แล้วคุณได้ดำเนินการเสร็จสิ้น pset กู้คืน ชื่อของฉันคือ Zamyla และนี่คือ CS50