>> [เล่นดนตรี]
>> 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