เจสัน Hirschhorn: ยินดีต้อนรับคุณ, ทุกคนที่จะสัปดาห์ที่ 6 ฉันมีความสุขที่จะเห็นคุณทั้งหมดมีชีวิตอยู่และดี หลังจากทดสอบ 0, เพราะฉันรู้ว่า เป็นบิตหยาบ แต่โชคดีที่ทุกท่าน ไม่ได้ดีอย่างเหลือเชื่อ และเพื่อให้เป็นที่ยอดเยี่ยม ถ้าคุณอยู่ในส่วนของฉันฉันได้รับมากที่สุด ของคุณสำรองแบบทดสอบของคุณแล้ว คู่ของคุณผมประชุม หลังเลิกเรียน และถ้าคุณเป็นนักเรียนขยายและ คุณไม่ได้รับการตอบคำถามของคุณกลับมา ยัง TF ของคุณอาจทำงานกับมัน และการจัดลำดับและจะได้รับมันกลับ กับคุณในไม่ช้า ดังนั้นนักเรียนส่วนขยายของฉันที่มี ดูตอนนี้ - หวังว่าจะมีชีวิตอยู่ - ฉันจะได้รับแบบทดสอบของคุณ ไม่นานมานี้ได้เป็นอย่างดี วาระการประชุมของเราในวันนี้เป็นดังนี้ ครั้งแรกที่เรากำลังจะไปกว่าบาง ทรัพยากรที่ CS50 ให้กับคุณ เรากำลังจะไปกว่าการทดสอบ 0 ถัดไปและ ผมจะตอบคำถามใด ๆ ของใคร มีเกี่ยวกับปัญหาโดยเฉพาะอย่างยิ่ง แล้วเราจะไปกว่า ยื่น I / O และปัญหาตั้ง 5 ที่สองหัวข้อที่จะใช้เวลา ขึ้นเป็นกลุ่มของส่วนวันนี้ ฉันใส่รายการนี​​้ขึ้นทุกสัปดาห์เป็น เตือนให้คุณทั้งหมด แต่ของแกน ส่วนเรามีเพียง 90 นาที - เรา จะไม่สามารถครอบคลุมทุกอย่างที่ฉัน ชอบที่จะครอบคลุมสำหรับคุณผู้ชาย แต่เราจะมีตันของทรัพยากรสำหรับ คุณสามารถวาดตามที่คุณได้รับรู้ วัสดุและการทำงานที่ผ่าน ชุดปัญหาของคุณ เตือนความทรงจำที่ฉันมีข้อความออนไลน์ กล่องตั้งค่าสำหรับคุณในการกรอกถ้าคุณ มีข้อเสนอแนะสำหรับผมใด ๆ ทั้งบวกและ สร้างสรรค์เกี่ยวกับส่วน URL ที่ตั้งอยู่ทางด้านขวาลงที่นี่ ดังนั้นโปรดใช้เวลาสักครู่หากคุณมี ข้อเสนอแนะว่าในระหว่างส่วน หรือหลังหรือหลังจากที่คุณดูวิดีโอ ออนไลน์เพื่อให้ข้อเสนอแนะของคุณฉัน ผมขอขอบคุณที่ใด ๆ และทั้งหมดของมัน ดังนั้นผมจึงได้มีการสนทนาเล็ก ๆ ที่มีจำนวนมากของฉัน นักเรียนตลอดสัปดาห์ - เป็นฉันมือ กลับแบบทดสอบการพูดคุยเกี่ยวกับ แน่นอนเห็นว่าคุณกำลังทำ และรูปแบบหนึ่งได้เกิดขึ้นซ้ำแล้ว กว่าในการพูดคุยเกี่ยวกับ - ใน โดยเฉพาะอย่างยิ่ง - ชุดปัญหา และฉันได้โพสต์รูปแบบที่ บนกระดานได้ในขณะนี้ โดยพื้นฐานแล้วมีความแตกต่าง ระหว่างการเปลี่ยนในสิ่งที่เป็น ทำอย่างถูกต้องและสิ่งที่ ที่จะทำดี คนส่วนใหญ่ได้รับการทำที่ยอดเยี่ยม ในแง่ของความถูกต้อง - 5 หรือ 4 ใน psets ทั้งหมด คนส่วนใหญ่จะได้รับ ที่ตลอดเวลา แต่เพียงเพราะคุณได้ทำ สิ่งที่ถูกต้องไม่ได้หมายความว่าคุณได้ ทำสิ่งที่เป็นอย่างหรูหราหรือ ได้อย่างมีประสิทธิภาพหรือเป็นเรียบร้อยตามที่คุณ จะได้ทำมัน และนั่นคือสิ่งที่การออกแบบ - และเลสเบี้ยนองศาสไตล์ - แกนสำหรับ ดังนั้นฉันผลักดันให้คุณทั้งหมดและ TFs อื่น ๆ จะผลักดันพวกคุณที่จะเปิดไม่เพียง แต่ ในสิ่งที่ถูกต้อง แต่เปิด ในสิ่งที่เขียนดี ไม่ได้ทำที่ไม่จำเป็นสำหรับลูป ไม่ได้คำนวณตัวแปรถ้า คุณจะได้ไม่ต้อง ตัวอย่างเช่นมองกลับไปที่ปัญหาการตั้งค่า 4 เมื่อวางอิฐบน หน้าจอทุกแถว - อิฐในทุก แถวที่กำหนดมี y เหมือนกัน - ความสูงเดียวกันประสานงาน เพื่อให้ y-ประสานงานไม่จำเป็นต้อง มีการคำนวณในการตกแต่งภายใน ซ้อนกันสำหรับวงที่คุณอาจใช้ จะนำก้อนอิฐเหล่านั้นบนหน้าจอ มันจะต้องมีการคำนวณทุก ทุกครั้งที่คุณเปลี่ยนแถวหรือ ย้ายไปลงแถว ดังนั้นบอกว่าถ้ามี 10 ก้อนอิฐที่อยู่ใน แถวแต่ละอิฐสามารถมีเดียวกัน y-ประสานงานและที่พิกัด ก็สามารถนำมาคำนวณ ครั้งเดียวสำหรับทุกคน มันไม่จำเป็นที่จะต้องมีการคำนวณ 10 ครั้งหรือไม่ว่าการคำนวณความต้องการ จะเกิดขึ้นในที่เกิดขึ้นจริง ฟังก์ชั่นการโทร - การเรียกใช้ฟังก์ชันใหม่ gracked ดังนั้นหากที่เป็นเพียงเล็กน้อยสับสนสำหรับ คุณมากขึ้นโดยทั่วไปสิ่งที่ ไม่จำเป็นต้องเกิดขึ้นทุกครั้งเดียว คุณไปผ่านห่วงสำหรับไม่ควรจะ ใส่ในห่วงสำหรับและไม่ควร เกิดขึ้นทุกครั้งที่คุณไปทุก ผ่านห่วงสำหรับ ตัวอย่างเช่นการออกแบบที่ดีอีกอย่างหนึ่งที่เราเห็น ในสัปดาห์ที่ 3 เป็นเวลา 15 คุณสามารถเก็บ ติดตามของศูนย์ ดังนั้นเมื่อคุณเริ่มต้นที่คณะกรรมการคุณ บันทึก - ในตัวแปรทั่วโลกอาจจะ - x และ y-ประสานงานของศูนย์ และจากนั้นเมื่อใดก็ตามที่คุณ - ในฟังก์ชั่นย้ายของคุณเมื่อใดก็ตามที่คุณทำ ย้ายที่ประสบความสำเร็จที่คุณปรับปรุง ตำแหน่งของศูนย์ ที่จะช่วยให้คุณประหยัดจากที่มีการทำ สำหรับลูปซ้อนกันมองผ่าน คณะกรรมการทุกครั้งในการทำงานของย้ายของคุณ และหาศูนย์หรือหากระเบื้อง แล้วตรวจสอบสิ่งที่ถัดไป แต่คุณต้องเป็นที่ตั้งของ ศูนย์คุณก็สามารถมองไปด้านล่าง และไปทางซ้ายและขวาของมันเพื่อหา กระเบื้องที่คุณกำลังมองหา ดังนั้นในแง่ของโปรแกรมที่เรากำลัง การเขียนก็จะไม่เคยมีขนาดใหญ่พอ ว่าบางส่วนของการตัดสินใจการออกแบบเหล่านี้ จะจริงจะขัดขวางคุณ โปรแกรมหรือทำให้มันทำงานช้ากว่า หรือบางทีก็วิ่งออกมาจากหน่วยความจำ แต่เราก็ยังคงผลักดันให้คุณผู้ชาย ที่จะเขียนเป็นสง่างามและ รหัสที่มีประสิทธิภาพที่สุด ดังนั้นถ้าคุณทำท้ายการเขียนสิ่งที่ ที่มีขนาดใหญ่อย่างมีนัยสำคัญ ขอบเขตที่พวกเขาจะได้รับการเขียนด้วยดี การออกแบบที่นอกจากจะเป็นที่ถูกต้อง ดังนั้นจำนวนของคุณมี ที่นำออกมา นั่นคือสิ่งที่เรากำลังมองหา - สิ่งที่เรากำลังจะดำเนินการต่อไป ผลักดันให้พวกคุณใน หากคุณเคยมีคำถามใด ๆ เกี่ยวกับ การออกแบบของโปรแกรมของคุณรู้สึกฟรี ถึงออกมาให้ฉันและฉันมีความสุขที่จะ เดินผ่านโปรแกรมของคุณกับคุณ และชี้ให้เห็นบางส่วนของการออกแบบ การตัดสินใจที่คุณทำและให้บางส่วน คำแนะนำเกี่ยวกับวิธีการที่จะทำให้ได้ การตัดสินใจการออกแบบที่ดีขึ้น ดังนั้นเรากำลังจะย้ายไป ที่จะพูดคุยเกี่ยวกับการทดสอบ 0 ก่อนที่เราจะทำอย่างไรที่ไม่ใคร มีคำถามใด ๆ เกี่ยวกับสิ่งที่ ฉันได้รับการคุ้มครองเพื่อให้ห่างไกล [พึมพำเสียง] เจสัน Hirschhorn: เจ็ดวินาที ตกลง ขอพูดคุยเกี่ยวกับการทดสอบ 0 สำหรับบิต ส่วนใหญ่ของคุณมีแบบทดสอบของคุณ 0 กลับ หากคุณไม่ได้หวังว่า คุณจำได้เล็กน้อย แต่ถ้าคุณได้รับการทดสอบ 0 แล้วคุณ นอกจากนี้ยังมีการเข้าถึงแบบออนไลน์ ตัวอย่างการแก้ปัญหา ไม่มีใครมีคำถามใด ๆ ก่อนที่จะ เรากระโดดลงไปในวัสดุสัปดาห์เกี่ยวกับ ปัญหาโดยเฉพาะอย่างยิ่งในการทดสอบ 0 - ทำไมคำตอบคือว่ามันคืออะไร เป็นใครสับสนเกี่ยวกับอะไร แม้ว่าคุณจะมีปัญหาที่ถูกต้อง แต่ เพียงแค่ต้องการให้ฉันอธิบายมันเล็กน้อย มากขึ้นผมมีความสุขที่จะทำในขณะนี้ ดังนั้นผมจึงได้ถามพวกคุณไป มาพร้อมกับบาง ความคิดเกี่ยวกับการทดสอบ 0 ดังนั้นผู้ที่ต้องการจะได้รับเรา เริ่มต้นด้วยคำถามหรือ แสดงความคิดเห็นเกี่ยวกับการทดสอบ 0? [กระดาษ RUSTLING] เจสัน Hirschhorn: ยังไม่ได้ทุกคน ได้อย่างสมบูรณ์แบบ ดังนั้นฉันรู้ว่า [หัวเราะ] จะต้องมีคำถามบางอย่าง เกี่ยวกับแบบทดสอบ 0 ตกลง ใช่ Ompica OMPICA: หมายเลข 10 เจสัน Hirschhorn: หมายเลข 10 ซึ่งเป็นหนึ่งในจำนวน 10? OMPICA: - เจสัน Hirschhorn: ฉัน haven't - OMPICA: รวม - เจสัน Hirschhorn: จำนวน 10 แปด กับฉัน - เขียนแปดถึงฉัน? OMPICA: ใช่ เจสัน Hirschhorn: OK ดังนั้นคำถามอื่นคุณอาจมี ขอเป็นฉันทิพยเนตร? คำตอบคือใช่ ในส่วนก่อนที่จะตอบคำถามที่ฉันถาม พวกคุณทั้งรหัสและสเตอร์ลิง แปดถึงฉัน ทั้งสองของพวกเขาที่เกิดขึ้นกับ ปรากฏในการตอบคำถาม ดังนั้นหวังว่าที่คุณจ่าย ความสนใจไปที่ และถ้าคุณได้แล้วคุณจะต้อง อาจจะทำได้ดีกับทั้งสอง แต่แปดถึง i, เราไม่ได้รหัสจริง ในชั้นเรียน แต่มันก็เป็นอีกครั้ง ถามเกี่ยวกับการตอบคำถาม ดังนั้นสองสิ่งที่จะใช้ ทราบเมื่อการเข้ารหัสแปดถึงฉัน สิ่งแรกที่ต่อคำถามที่เป็น ที่คุณจำเป็นต้องตรวจสอบว่าสตริง เท่ากับโมฆะ สองสามคนพยายามที่จะตรวจสอบในภายหลัง ในโปรแกรมนี้ถ้าวงเล็บผม - เพื่อให้ตัวละครที่เฉพาะเจาะจงในการที่ สตริง - เท่ากับโมฆะ แต่จำไว้ null ที่เป็นหลัก - มันเป็นเรื่องดีที่จะคิด null เป็นตัวชี้ศูนย์ - ตัวชี้ไปยังศูนย์ - บางแห่งในหน่วยความจำที่ คุณจะไม่สามารถเข้าถึง ดังนั้นหากสิ่งที่มีค่าเท่ากับโมฆะคุณ รู้ว่ามันยังไม่ได้รับการเริ่มต้น หรือมีอะไรที่มี ดังนั้นคือดาวถ่าน, s ฉันวงเล็บเป็นถ่าน ดังนั้นมันทำให้รู้สึกที่จะเปรียบเทียบเพื่อโมฆะ, แต่ไม่ s วงเล็บฉันเป็นโมฆะ แต่อีกครั้ง - เพื่อให้เป็นสิ่งแรกที่ ที่คุณควรจะทำ - ตรวจสอบให้แน่ใจว่าคุณจริง มีสตริงจริง ถัดไปคุณต้องการที่จะไปผ่าน ตัวละครในแต่ละสาย และเพื่อที่จะเป็นเช่น s วงเล็บ ผมยกตัวอย่างเช่นถ้าฉันเป็นซ้ำของคุณ และใช้ตัวอักษรที่และ ได้รับค่าที่แท้จริงของมัน ที่คุณได้เก็บไว้เป็นถ่าน แต่ ค่า ASCII ศูนย์ - ศูนย์เป็นตัวละคร - ไม่จริงเลขศูนย์ มันเป็นบางอย่างที่หมายเลขอื่น ๆ ที่คุณสามารถ มองขึ้นไปในตาราง ASCII ดังนั้นวิธีหนึ่งที่จะแก้ไขให้ถูกต้องสำหรับการที่ - น่าจะเป็นวิธีที่ดีที่สุดที่จะถูกต้องสำหรับ ว่า - จะถูกลบออกจากมัน ค่าตัวละคร - ศูนย์เป็นตัวอักษร คำพูดเดียวเพื่อลบเป็นศูนย์ อีกคำพูดเดียว ที่จะนำสิ่งที่หมายเลขที่คุณมี เป็นถ่าน, และได้รับมันเท่ากับ จำนวนเป็นจำนวนเต็มที่เกิดขึ้นจริง และที่คล้ายกันมากกับวิธีการ ผู้คนจำนวนมากเข้ามาใน ปัญหาชุดที่ 2 กับซีซาร์ และ Viginere - ยันต์เหล่านั้นเมื่อคุณ ถูกหมุนได้ ดังนั้นหลังจากที่คุณมีเป็นจำนวนจาก ศูนย์ถึงเก้าแล้ว - ขึ้นอยู่กับ ที่จะไปในจำนวนที่สูงสุด - คุณจำเป็นต้องคูณ โดยอำนาจของ 10 บางคนเดินออกมาจากด้านหลังเพื่อ ด้านหน้าและคูณแต่ละบุคคล จำนวนโดยอำนาจของ 10 บางคนย้ายจาก ด้านหน้าไปด้านหลัง - และเพื่อให้เกิดสูงสุด สั่งซื้อหมายเลขแรก - และจะช่วยผู้ที่อยู่ใน ตัวแปรเคาน์เตอร์ทั่วโลก แล้วแต่ละครั้งที่ผ่านการ วงคูณยักษ์ที่ทั่วโลก ตอบโต้ด้วย 10 ตัวแปรที่จะทำให้ พื้นที่สำหรับถ่านต่อไป เพื่อให้เป็นสับสนเล็กน้อยโดยไม่ต้อง ฉันเขียนมันขึ้นมาบนเรือ แต่สารละลายตัวอย่าง มีให้คุณ แต่สิ่งที่มีขนาดใหญ่ เรากำลังมองหา นอกจากนี้ยังมีการตรวจสอบเพื่อให้แน่ใจว่าแต่ละ ตัวบุคคลได้แน่นอน ตัวละครระหว่างศูนย์และเก้าและไม่ บางตัวละครอื่น ๆ เช่น, เช่น สิ่งเหล่านี้เป็นสิ่งที่เรากำลังมองหา ในคำถามที่ ไม่ว่าจะตอบคำถามของคุณหรือไม่ OMPICA: ใช่ เจสัน Hirschhorn: OK มีคำถามอื่น ๆ เกี่ยวกับแบบทดสอบ 0? สิ่งที่เกี่ยวกับการรวบรวม? ทุกคนรวบรวมใช่ไหม เลขที่ มี - [หัวเราะ] คำถามใด ๆ เกี่ยวกับ การรวบรวม? ว้าว [กระดาษ RUSTLING] เจสัน Hirschhorn: ใช่ ไมเคิล MICHAEL สินค้าจำนวน 7 - สุ่ม เจสัน Hirschhorn: หมายเลข 7 จำนวน 7 เป็นจำนวนเต็มได้รับการสุ่ม ยอดเยี่ยม ดังนั้นคุณจะได้รับจำนวนเต็มและ จำนวนเต็ม b และคุณต้องการสุ่ม จำนวนเต็มระหว่าง a และ b จริงเราสามารถเขียนหนึ่งนี้ กระดานเพราะคนนี้ เป็นหนึ่งบรรทัดของรหัส - วิธีหนึ่งที่จะทำมัน ดังนั้นเราจึงกำลังได้รับ Drand เป็น ทำงานเราสามารถใช้ และสิ่งที่ไม่ Drand - สมมติว่ามันถูกเมล็ด - สิ่งที่ไม่ Drand กลับ? MICHAEL: ลอยระหว่าง 0.0 และ 1.0 เจสัน Hirschhorn: จำนวน - ใช่ จำนวนระหว่าง 0 และ 1 และเพื่อให้เรามี b และ และแล้วเราก็มีจำนวนสุ่มของเรา ระหว่าง 0 และ 1 ให้กับเราโดย Drand บางคนพยายามที่จะนำ b หรือ b ลบ หรือสิ่งที่อยู่ข้างในนั้น วงเล็บ นั่นก็หมายความว่าพวกเขากำลัง ข้อโต้แย้งที่ฟังก์ชั่นนี้ Drand ไม่ใช้ข้อโต้แย้งใด ๆ - เช่น getString ไม่ ไม่ใช้ข้อโต้แย้งใด ๆ จึงเป็นเพียงวงเล็บเปิดปิด paren - และที่ตัวเองเป็น การเรียกใช้ฟังก์ชัน และที่จะช่วยให้คุณเป็นจำนวนมาก ระหว่าง 0 และ 1 แน่นอนเรามีทั้งช่วง ว่าตัวเลขอาจจะค่ะ พูดว่าถ้า b คือ 10 และ 5 เป็นเราจริงๆ ต้องการตัวเลขที่มีช่วงของ 5 ดังนั้นสิ่งต่อไปที่เราต้องทำคือ คูณนี้โดยช่วง b ลบ ดังนั้นสมมติว่ามีการคูณ และที่จะให้เราเป็นจำนวนมาก ภายในช่วงที่กำหนด และช่วงที่ระบุว่าเป็น ความแตกต่างระหว่าง b ลบ และสุดท้ายเท่านั้นที่จะให้มันจาก - กล่าวว่าช่วงระหว่าง b ลบ ที่ 5 ที่จะให้เรา จำนวน 0-5 แต่ถ้าในความเป็นจริง 5 เราต้องเพิ่ม ช่วงนี้ขึ้นเพื่อที่จะเป็น ควรจะเป็นจริงโดยการเพิ่ม เพื่อให้ได้รับสิทธิในตรรกะ แล้วคุณจะมี คำถามอื่นได้หรือไม่ ไมเคิล: เลขที่ ฉันเพียงแค่รู้สึกโง่จริงๆตอนนี้ [หัวเราะ] เจสัน Hirschhorn: เลขที่ ไม่รู้สึกโง่จริงๆ จำนวนของคนที่ต่อสู้ ด้วยคำถามนี้ แล้วคำถามอื่น ๆ คือ Drand, ที่คุณกล่าวว่าจะช่วยให้คุณลอย - กลับลอย แต่ฟังก์ชั่นนี้ถามจริง เพื่อจำนวนเต็มจะถูกส่งกลับ คุณไม่จำเป็นต้องที่จะโยนนี้อย่างชัดเจน เป็นจำนวนเต็มเพราะสิ่งเหล่านี้ การดำเนินงานที่จะรักษามันเป็นทั้งหมด ลอย - เป็นจำนวนจุดลอย เช่นนี้จะ - แม้ว่านี้ เป็นจำนวนเต็มนี้จะ จะคูณได้อย่างถูกต้อง ทั้งหมดคูณจะทำงาน คุณไม่จำเป็นต้องที่จะโยนมันที่นี่ ในความเป็นจริงคุณไม่ควรโยน ที่จะ - ถ้าคุณจะโยนจำนวน ที่ระหว่าง 0 และ 1 - จำนวนสุ่มลอยจุด - แล้วมันอาจจะเป็นเพียง 0 หรือ 1 ดังนั้น คุณจะสูญเสียทั้งหมดของความแม่นยำที่ แต่ในท้ายที่สุดเมื่อคุณกลับมา จะได้รับโดยอัตโนมัติ ส่งกลับเป็นจำนวนเต็ม ดังนั้นคุณจึงไม่จำเป็นต้องทำ ว่าตัวเองหล่อ ดังนั้นนี่คือคำตอบ คำถามที่ 7 จำนวน คำถามใด ๆ ที่อื่น ๆ ในแบบทดสอบ 0? ใช่แอนนี่ ANNIE: เมื่อไหร่ที่เราใช้ซ้ำ - เมื่อใดที่เราใช้ลูปซ้ำ? เจสัน Hirschhorn: คุณจะใช้เมื่อ ซ้ำ - เพื่อให้มากกว่าปกติ ข้อดีและข้อเสียของการเรียกซ้ำเมื่อเทียบกับ วิธีการทบทวน ใครสามารถนำเสนอโปรหรือแย้งหรือไม่ กรุณา? ไม่สามารถทุกคน ที่สามารถนำเสนอโปรหรือแย้งหรือไม่ [กระดาษ RUSTLING] นักเรียน 1: ซ้ำน้อย การเข้ารหัส - การพิมพ์น้อยลงหรือไม่ เจสัน Hirschhorn: ดังนั้นโดยทั่วไป เรียกซ้ำโดยเฉพาะอย่างยิ่งการทำงาน - หรือขั้นตอนวิธีการเช่นผสาน จัดเรียง - ที่ยืมตัวเอง ที่จะใช้วิธีการซ้ำ - อาจจะตรงไปตรงมามากขึ้น รหัสซ้ำ และเพียงแค่ทำให้รู้สึกมากขึ้น ที่จะทำซ้ำ เพื่อที่จะเป็นมืออาชีพในการเรียกซ้ำ คนอื่นอย่างไร ใช่? นักเรียนที่ 2: การเรียกซ้ำ Con - จะใช้หน่วยความจำเพิ่มเติม เจสัน Hirschhorn: ดังนั้นตรงขวา ฟังก์ชั่นซ้ำจะเก็บเพิ่ม กองเฟรมไปยังกอง ดังนั้นถ้าคุณกำลังปฏิบัติการในหลาย ตัวเลขและมีการเรียกนี้ ทำงานมากแล้วคุณจะได้อย่างแน่นอน ใช้หน่วยความจำมากขึ้นในขณะที่ วิธีการทบทวนที่จะทำให้หนึ่ง กองกรอบในกองเพราะ มันทั้งหมดที่เกิดขึ้นภายในหนึ่งฟังก์ชัน ๆ ข้อดีและข้อเสียอื่น ๆ ใช่ นักเรียน 3: ข้อดีในการเรียกซ้ำ คุณไม่ได้มีการตรวจสอบใน ล่วงหน้ากี่ครั้ง มีรหัสที่จะทำซ้ำ คุณสามารถมีจำนวนที่กำหนดไว้ของ เวลาที่คุณต้องย้ำแล้ว เรียกซ้ำตัวเองจะดีกว่าเพราะ มันต้องใช้ผลที่ เจสัน Hirschhorn: ผมคิดว่าเป็นความจริง แต่ผมคิดว่าในทั้งสองกรณี ที่คุณจะไม่เคย - คุณอาจจะได้รับบาง ข้อมูลจากผู้ใช้ หรือฟังก์ชั่นนี้จะมีข้อมูลบางส่วน ที่จะตรวจสอบกี่ครั้งก็ ควรใช้ ดังนั้นโดยทั่วไปคุณจะไม่ยากรหัส - แม้จะอยู่ในวิธีการซ้ำ - วิธี หลายต่อหลายครั้งวงที่ควรจะทำงาน คุณมีอีกคุณ คิดเกี่ยวกับแอนนี่? ตกลง ดังนั้นผู้ที่อาจจะสอง - โปรที่ใหญ่ที่สุดและใหญ่ที่สุด con ที่จะซ้ำเมื่อเทียบกับ วิธีการทบทวน ตกลง สิ่งอื่นในแบบทดสอบ 0? ขอย้ายไปอยู่กับ ไฟล์ I / O นอกจากนี้ที่ยอดเยี่ยมในระยะสั้น ในสัปดาห์นี้ในไฟล์ I / O ที่หวัง คุณได้ดูหลาย ครั้งและชื่นชม ทำงานมากเดินเข้าไปในนั้นและฉัน ได้ยินจะเป็นประโยชน์อย่างบ้าคลั่ง ฉันยังรวมถึงการเชื่อมโยงบนภาพนิ่งนี้ ในกรณีที่คุณไม่ได้มี โอกาสที่จะดูมัน 10 ครั้ง ดังนั้นเราจะสั้นไปกว่า ขั้นตอนที่สำคัญในการเปิดและการทำงาน กับไฟล์และจากนั้นเราจะไป ดำน้ำในปัญหาการเข้ารหัสก่อน การตรวจสอบปัญหาที่กำหนด ดังนั้นอีกครั้งฉันจะใส่นี้ขึ้นอยู่กับ หน้าจอ แต่ฉันจะพูดคุย เพียงแค่นาทีเกี่ยวกับสิ่งที่เรากำลัง ทำที่นี่กับแฟ้ม I/O-- สิ่งที่หมายความว่าอย่างไร นั่นหมายความว่าเราสามารถสร้างของเรา โปรแกรมแล้วมีโปรแกรมของเรา ออกและไม่ได้ทำให้ผลกระทบใด ๆ โลกภายนอกของโปรแกรมของเรา แต่เมื่อเราเริ่มต้นการทำงานกับไฟล์ - ทั้งพวกเขาในการอ่านและการสร้าง พวกเขา - เราสามารถมีผลกระทบต่อบางส่วน โลกภายนอกของโปรแกรมของเรา เช่นเดียวกับถ้า Microsoft Word ไม่สามารถ เพื่อให้เอกสารใด ๆ Word, แล้ว เมื่อ Microsoft Word ออกทั้งหมดของคุณ การทำงานจะได้รับหายไปและมันจะ จริงๆจะไร้ประโยชน์ ในที่สุดเราไม่ต้องการที่จะสามารถที่จะ เขียนโปรแกรมที่สามารถส่งผลกระทบต่อ โลกรอบตัวพวกเขาทั้งสองโดยการใน ปัจจัยการผลิตที่ซับซ้อน - ในแง่ของไฟล์และ ผ่านไฟล์และยังมีการสร้างที่น่าสนใจ และผลที่น่าสนใจ - ในแง่ของชนิดของไฟล์ ดังนั้นนั่นคือเหตุผลที่เราจะเริ่มต้นที่จะ เรียนรู้วิธีการทำงานกับไฟล์ โดยเฉพาะอย่างยิ่งสิ่งที่ เราจะเป็นดังนี้ มันง่ายมาก มีเพียงไม่กี่ขั้นตอนและ พวกเขาจะอยู่ที่นี่ในรหัสนี้ ดังนั้นเรากำลังจะผ่านไป สายรหัสนี้โดยสาย ครั้งแรกที่คุณจะเห็นไฮไลต์ - เมื่อคุณกำลังทำงานกับไฟล์ โดยไม่คำนึงถึงชนิดของไฟล์เป็น คุณต้องการที่จะเปิดมัน และที่มีการเรียกร้องไปยัง fopen - ขวาที่นี่ คุณรวมถึงชื่อของไฟล์ ถ้าแฟ้มไม่ได้อยู่ในไดเรกทอรีของคุณ หรือโฟลเดอร์ที่โปรแกรมนี้ ชีวิตแล้วคุณยังต้องรวมถึง เส้นทางไปที่ไฟล์ที่เป็น เรากำลังจะไปคิดว่านี้ ไฟล์ที่เรียกว่า "text.txt" - เอกสารข้อความง่าย - อยู่ใน โฟลเดอร์เดียวกันกับโปรแกรมนี้ เพื่อให้เป็นสิ่งที่จะต้องเก็บไว้ในที่อื่น ใจ - ว่าถ้าคุณต้องการที่จะเปิดไฟล์ ที่อื่นที่คุณต้องการจริง รวมถึงทำเลที่ตั้ง ประการที่สองคุณสามารถส่งผ่านอาร์กิวเมนต์ไป fopen และนั่นคือสิ่งที่คุณต้องการจะทำ พร้อมกับแฟ้ม มีสามข้อโต้แย้งหลักที่มี คุณกำลังจะส่งผ่านไปยัง fopen ที่สามารถให้ฉันที่สาม ที่สามารถให้ฉันหนึ่งของพวกเขา ใช่ นักเรียน 4: ชื่อไฟล์? เจสัน Hirschhorn: ขออภัย สามข้อโต้แย้งหลักที่คุณสามารถส่งผ่าน เป็นอาร์กิวเมนต์ที่สองจะ fopen คุณขวา - ชื่อไฟล์ เป็นอาร์กิวเมนต์แรก แต่อาร์กิวเมนต์ที่สอง fopen เป็น ทั่วไปสามสายและ - ใช่ aleja aleja: การผนวก เจสัน Hirschhorn: ถ้าคุณต้องการที่จะ ผนวกกับไฟล์ที่มีอยู่แล้ว นักเรียน 5: อาร์สำหรับการอ่าน เจสัน Hirschhorn: A ถ้าคุณ ต้องการที่จะอ่านจากแฟ้ม นักเรียนที่ 6: W การเขียน เจสัน Hirschhorn: และ W, ถ้าคุณ ต้องการที่จะเขียนไปยังแฟ้ม ดังนั้นในกรณีนี้เรากำลังเขียน ไปยังแฟ้มเพื่อให้เรามีน้ำหนัก คุณเปิดคุณยังมีการบันทึก ไฟล์ที่และที่ที่มี รหัสไปทางด้านซ้ายมือของ ผู้ประกอบการที่ได้รับมอบหมาย - ฉันสร้างตัวชี้ไปยังแฟ้ม เรียกว่าในกรณีนี้ไฟล์ เราจะไม่ต้องกังวลอะไร สิ่งนี้ไฟล์เป็นตัวพิมพ์ใหญ่ทั้งหมด พอเพียงที่จะบอกว่ามันเป็นเวลานาน กระแสของศูนย์และคน และนั่นคือวิธีการที่เราจะไป ทำงานได้และเข้าใจมัน สิ่งต่อไปที่เราต้องทำ - และ นี้เป็นสิ่งสำคัญอย่างเหลือเชื่อ - เมื่อใดก็ตามที่คุณเปิดแฟ้ม - ในความเป็นจริงเมื่อใดก็ตามที่คุณโทร malloc สำหรับ ตัวอย่างและได้รับหน่วยความจำบางและพยายาม และบันทึกไว้ในตัวชี้คุณเสมอ ต้องการที่จะตรวจสอบให้แน่ใจว่า ฟังก์ชั่นไม่ได้กลับมาเป็นโมฆะ ดังนั้นในกรณีนี้เราจะตรวจสอบเพื่อให้ ให้แน่ใจว่าเราได้เปิดจริง ยื่นได้อย่างถูกต้องและมี ข้อผิดพลาดในโปรแกรมของเราไม่มี ถัดไปเมื่อเราได้ตรวจสอบเพื่อให้แน่ใจว่า ว่าเรามีไฟล์ทำงานที่เราสามารถทำได้ เขียนหรืออ่านจาก หรือผนวกไปยังแฟ้ม ในกรณีนี้ผมเพียงแค่พิมพ์ บรรทัดเดียวกับไฟล์นี้ ฉันจะรู้ได้อย่างไรว่า? ดีฉันใช้ฟังก์ชันนี้ เรียกว่า fprintf ทุกฟังก์ชั่นที่คุณจะใช้ เมื่อเขียนหรืออ่านจากหรือ การจัดการกับไฟล์ที่จะคล้ายกับ ฟังก์ชั่นที่คุณเคยเห็นมาก่อน แต่ เริ่มต้นด้วยตัวอักษร F, ยืนไฟล์ และ fprintf ซึ่งแตกต่างจากการพิมพ์ตามปกติของเรา app ที่ใช้อาร์กิวเมนต์เพิ่มเติมอย่างใดอย่างหนึ่ง และที่เป็นไฟล์ที่คุณ ต้องการพิมพ์บรรทัดนี้ไป ผมไม่ได้มีอะไรที่จะ ด้านขวาของ ohai ผมไม่ได้มีที่สาม อาร์กิวเมนต์ printf - หรืออาร์กิวเมนต์ที่สอง printf, อาร์กิวเมนต์ที่สามจะ fprintf เพราะฉัน ไม่ได้มีตัวยึดใด ๆ ที่นี่ ฉันไม่ได้รวมถึงตัวแปรใด ๆ แต่อีกครั้ง fprintf และทุกไฟล์เหล่านี้ ฟังก์ชั่นที่ทำงานกับไฟล์ โดยทั่วไปจะต้องมีแฟ้ม ที่พวกเขากำลังปฏิบัติการ สุดท้ายสิ่งที่สำคัญสุดท้ายที่จะ ทำคือการปิดแฟ้มเช่นเดียวกับ ด้วย - เมื่อใดก็ตามที่เรา malloc บางสิ่งบางอย่าง เราต้องการที่จะเป็นอิสระบางสิ่งบางอย่างที่เราเกรงว่า มีหน่วยความจำรั่ว - เราต้องการ ปิดแฟ้มของเรา หากโปรแกรมนี้ออกได้โดยไม่ต้องปิด ไฟล์ราคาที่ไม่มีอะไรที่จะไป ที่ไม่ถูกต้องโดยเฉพาะอย่างยิ่งถ้ามัน เป็นไฟล์ขนาดเล็ก แต่มันเป็นอย่างแน่นอนรูปแบบการเข้ารหัสที่ดี และการปฏิบัติเสมอปิดแฟ้มของคุณ เมื่อคุณเสร็จสิ้นการใช้มัน เพื่อให้เป็นพื้นฐานของไฟล์ I / O คุณอาจได้เห็นว่าก่อนหรือ ดูมันในการที่ยอดเยี่ยมในระยะสั้น ไม่มีใครมีคำถามใด ๆ ก่อนที่จะ เราไปลงในบางเข้ารหัสการปฏิบัติ ปัญหาเกี่ยวกับไฟล์ I / O หรือ ขั้นตอนที่ฉันเพิ่งไปมากกว่า [พิมพ์ดีดเสียง] เจสัน Hirschhorn: คุณ มีคำถาม Avi? AVI: เลขที่ เจสัน Hirschhorn: OK ฉันจะรออีก เจ็ดวินาที [หัวเราะ] นั่นคือเคล็ดลับที่ดีจริงๆ พวกคุณไม่ชอบ การถามคำถาม ที่ปรับได้ ตกลง ดังนั้นปัญหาการปฏิบัติของเราเป็นครั้งแรกที่เรามี จะซ้ำกันฟังก์ชั่นของ เครื่องมือบรรทัดคำสั่งที่คุณอาจ ใช้ก่อน - สำเนา - เครื่องมือคัดลอก ถ้าคุณพิมพ์ cp แล้วผ่านมันสอง ข้อโต้แย้งที่เข้ากับขั้วของคุณที่คุณสามารถ คัดลอกไฟล์ และเป็นสิ่งที่เราจะไป ที่จะเขียนในตอนนี้ ดังนั้นอีกครั้งอ่านออกของภาพนิ่งนี้ผมต้องการ คุณสามารถเขียนโปรแกรมที่จะใช้เวลา สองและมีเพียงสองบรรทัดคำสั่ง ขัดแย้ง - แฟ้มแหล่งที่มาและแฟ้มปลายทาง - และสำเนาเนื้อหาของแหล่งที่มา แฟ้มแฟ้มปลายทาง หนึ่งไบต์ในเวลา เพื่อให้เป็นจำนวนมากที่จะขอ อีกครั้งเป็นวิธีการที่ดีในการนี​​้คือการ ไม่ได้ไปตรงกับรหัส C แต่ ทำลายมันลงไม่กี่ขั้นตอน ขั้นแรกให้คิดเกี่ยวกับตรรกะ - ว่า สิ่งที่ฉันขอให้คุณทำ - และทำความเข้าใจทั้งหมดของ ขั้นตอนในการแก้ไขปัญหานี้ ไม่ได้อยู่ใน C เพียงใน pseudocode บาง หรือแม้กระทั่งรูปแบบของจิต สิ่งที่เกิดขึ้น ถัดไปเมื่อคุณมี pseudocode ลง คิดออกว่า pseudocode แผนที่ลงบนเครื่องมือและสิ่งที่เราได้ เรียนรู้ที่จะใช้ในการ C. และในที่สุดเมื่อคุณมีทุกอย่างที่ ร่วมกันคุณสามารถรหัสปัญหา ใช้เวลา 5 ถึง 10 นาทีในการ ทำงานเกี่ยวกับปัญหานี้ ฉันจะใส่คำแนะนำ กลับขึ้นไปในครั้งที่สอง แล้วเราจะไปกว่า pseudocode และรหัส มันอยู่เป็นกลุ่ม หากคุณมีคำถามใด ๆ ในขณะที่คุณกำลัง ที่ทำงานเกี่ยวกับเรื่องนี้ให้ความรู้สึกอิสระที่จะยกระดับ มือของคุณและฉันจะมา ไปรอบ ๆ และตอบพวกเขา นักเรียน 7: ฉันสามารถรูด ชิ้นส่วนของกระดาษ เจสัน Hirschhorn: เกิดอะไรขึ้น [พิมพ์ดีดเสียง] เจสัน Hirschhorn: OK ขอไปกว่า pseudocode แรกและ แล้วฉันจะให้คุณทั้งคู่มากขึ้น นาทีเพื่อเสร็จสิ้นการเข้ารหัส ใครอยากจะเริ่มต้นฉันลง กับบรรทัดแรกของ pseudocode สำหรับการทำงานนี้ นักเรียน 8: ตรวจสอบให้แน่ใจว่า คุณได้รับสองไฟล์ เจสัน Hirschhorn: OK และถ้าเราไม่ได้? นักเรียน 8: ฉันจะกลับ 0 เจสัน Hirschhorn: เราควรจะกลับ 0? นักเรียน 8: กลับ - blanking ขอโทษ เจสัน Hirschhorn: ใช่ อาจจะไม่ได้ 0 เพราะ 0 หมายถึงทุกอย่างที่เป็นสิ่งที่ดี ตกลง เพื่อให้เป็นบรรทัดแรก ของ pseudocode ที่มีบรรทัดที่สองของ pseudocode? นักเรียน 9: เปิดไฟล์ทั้งสองได้หรือไม่ เจสัน Hirschhorn: เปิดไฟล์ทั้งสอง OK? นักเรียน 10: ตรวจสอบดู ถ้าไฟล์เป็นโมฆะ? เจสัน Hirschhorn: ตรวจสอบให้ แน่ใจว่าไม่เป็นโมฆะ เช่นกัน - เฉือน 0 - คือโมฆะ? นักเรียน 11: เลขที่ เจสัน Hirschhorn: นั่นไม่โมฆะ ที่เรียกว่าเทอร์มินัล มันสะกดจริงมีเพียงหนึ่งลิตร ดังนั้นการตรวจสอบสิ่งที่ต่อว่า - ที่จริงตัวละคร - ดังนั้นการตรวจสอบบางสิ่งบางอย่างกับที่ ไม่เหมือนกับการตรวจสอบเพื่อดูว่ามัน เท่ากับโมฆะ และบางคน - ในแบบทดสอบและปัญหาของพวกเขา ชุด - ได้มี สองผู้ที่สับสน แต่ทั้งสองของผู้ที่เป็น ในความเป็นจริงที่แตกต่างกัน หนึ่งสิ้นสุดสตริง - หนึ่งเป็นตัวชี้ไป 0 นักเรียน 12: ทำไมคุณจะไม่ตรวจสอบ ตรวจสอบให้แน่ใจว่าไฟล์ที่ไม่โมฆะ ก่อนที่จะเปิดได้อย่างไร เจสัน Hirschhorn: ดังนั้นเปิดบันทึก บางสิ่งบางอย่างในแฟ้มที่ และหากคุณไปกลับมาที่นี่ - ดังนั้นสายนี้ - fopen - จะให้ที่อยู่และจัดเก็บ ที่อยู่ในแฟ้มที่ว่าการทำงาน ถ้าไม่ได้ทำงานก็ จะเก็บโมฆะ - นักเรียน 12: โอ้ ตกลง มีคุณ เจสัน Hirschhorn: ในแฟ้ม ดังนั้นคุณจึงไม่สามารถตรวจสอบโมฆะ ก่อนที่คุณจะเปิดพวกเขา NULL หมายถึงสิ่งที่ไม่ได้ ทำงานอย่างถูกต้อง ตกลง เพื่อตรวจสอบเพื่อให้แน่ใจว่าไม่เป็น? หรือมีอะไรบ้าง เราคิดอย่างไร เราจะไปกับที่ นักเรียน 13 สินค้า เจสัน Hirschhorn: หรือไม่ ไม่เป็น? นักเรียน 13 สินค้า เจสัน Hirschhorn: OK เราดูเหมือนจะมีบางส่วน สอดคล้องกับที่ ไม่เป็นโมฆะ ตกลงบรรทัดถัดไปของ pseudocode ที่ไม่ได้ให้ฉันบรรทัดหรือยัง เราจะรอให้คุณ ใช่ นักเรียน 14: คุณต้องอ่าน จากไฟล์แรก เจสัน Hirschhorn: OK นักเรียน 14: หรือที่เราใช้ fscanf หรือ สิ่งที่ต้องการที่ไฟล์แรกได้หรือไม่ เจสัน Hirschhorn: ดังนั้นเราต้องการที่จะ อ่านจากไฟล์แรกและ - ให้ใส่ที่อยู่ที่นี่ อ่านจากแฟ้มแหล่งที่มา และแล้วสิ่งที่เราทำหลังจากที่เรา อ่านจากแฟ้มแหล่งที่มา? คนอื่น? นักเรียน 15: เขียนลงใน แฟ้มปลายทางหรือไม่ เจสัน Hirschhorn: เราเขียนเพื่อ แฟ้มปลายทางและ - ตกลง อะไรที่เราขาดหายไป คนอื่น ๆ ที่ยังไม่ได้ให้ฉัน บรรทัดของรหัสยัง - ของ pseudocode ใช่ นักเรียน 16: บางทีคุณอาจจะสามารถตรวจสอบ ไม่ว่าจะมีบางสิ่งบางอย่างในการอ่านสำหรับ เช่นสายต่อไปหรือไม่ ที่เป็นเช่นบรรทัดถัดไป ดูว่ามันมีอยู่ [อิเล็กทรอนิกส์เสียงบี๊บ] เจสัน Hirschhorn: โอ๊ะ นั่นเป็นซอฟต์แวร์ journaling ของฉัน ใช่? นักเรียน 16: ใช่ เจสัน Hirschhorn: เพื่อให้ ให้ฉันอีกครั้งหนึ่ง นักเรียน 16: ตรวจสอบว่ามี ยังคงเป็นบรรทัดถัดไปจาก แฟ้มแหล่งที่มาในการอ่าน เจสัน Hirschhorn: OK ดังนั้นเราไม่ได้อ่านบรรทัด - กำลังอ่านไบต์ที่นี่ - แต่คุณที่ถูกต้อง เราต้องการที่จะอ่านและเขียนจน ไม่มีไบต์ ตกลง และอื่น ๆ เหล่านี้จริงๆควรจะเยื้อง นิด ๆ หน่อย ๆ เพราะพวกเขากำลังอยู่ภายใต้การมี ใช่มั้ย? จนกว่าเราจะออกจากไบต์ที่เรากำลังจะ อ่านจากแฟ้มแหล่งที่มาและเขียน ในแฟ้มปลายทาง และแล้วสิ่งที่เป็นครั้งสุดท้าย สายของ pseudocode? คนที่ไม่ได้รับ สิ่งที่ฉันยัง นักเรียน 17: ปิดไฟล์หรือไม่ เจสัน Hirschhorn: แน่นอน ปิดไฟล์ ดังนั้นจึงมี pseudocode ของเรา ฉันจะใส่ลงไปใน pseudocode Gedit และในไม่กี่นาทีเรา จะรหัสนี้ร่วมกัน ตกลง ขอให้เราเริ่มต้นเป็นกลุ่ม Nishant ผมมีไฟล์ใหม่ของฉัน ผมได้เปิดเพียงแค่นี้ขึ้น เอกสาร Untitled 1 อะไรเป็นสิ่งแรกที่ฉันควรทำอย่างไร Nishant: รวมทั้งห้องสมุด? เจสัน Hirschhorn: OK สิ่งที่ห้องสมุด? Nishant: stdio.h, stdlib.h ผมเชื่อว่า? เจสัน Hirschhorn: OK stdlib หาคืออะไร Nishant: ฉันลืม เจสัน Hirschhorn: OK ดังนั้นรวม stdio ฉันควรทำอย่างไรก่อน ผมเริ่มเขียนโปรแกรม? Nishant เขียนส่วนหัวหรือไม่ เจสัน Hirschhorn: วิธี ฉันจะได้รับมันสี? [VOICES interposing] Nishant: คุณจะได้รับมันได้อย่างไรสี? เจสัน Hirschhorn: วิธี ผมสีเข้ารหัส? Nishant: ผมไม่ทราบว่า โอ้ ประหยัด เจสัน Hirschhorn: บันทึก ใช่ ฉันควรจะบันทึกเป็น c. เพื่อบัน​​ทึกไว้บนเดสก์ทอปเป็น cp.c. หวาน และถ้าผมต้องการที่จะได้รับเต็มรูปแบบ จุด, สิ่งที่ฉันควร รวมถึงที่อยู่ด้านบนหรือไม่ Nishant: คุณสามารถเขียนชื่อชื่อของคุณ ของโปรแกรมและวัตถุประสงค์ ของโปรแกรมด้วยหรือไม่ เจสัน Hirschhorn: ดูดี ยอดเยี่ยม เพื่อให้คุณได้เริ่มต้นเราออกอย่างสมบูรณ์ # include - เรายังจะเขียน - ตกลง ดังนั้นฉันคิดว่าฉันตั้งค่าทั้งหมดที่จะไป ที่มีบรรทัดแรกของรหัสสำหรับฉัน - หรือบรรทัดแรกของรหัสที่ มันจะใช้เวลาในการตอบสนองครั้งแรกของเรา แสดงความคิดเห็นใน pseudocode? คุณ นักเรียน 18: ไม่ควรที่จะเป็น int argc และ char * argv? เจสัน Hirschhorn: ผมคิดว่า คุณขวา ลองเปลี่ยนเป็น int หลักวงเล็บเปิด int argc จุลภาค char * argv? เช่นเดียวกับที่ นักเรียน 18: วงเล็บ เจสัน Hirschhorn: วงเล็บ เปิดวงเล็บวงเล็บปิด ผู้ปกครองอย่างใกล้ชิด สมบูรณ์ ตอนนี้ผมสามารถใช้อาร์กิวเมนต์บรรทัดคำสั่ง ตกลง ให้แน่ใจว่าเรากำลังได้รับสองไฟล์ คุณสามารถให้ฉันเช่นกัน นักเรียน 18: ถ้า argc - อันนี้ไม่เท่ากับ 3 เจสัน Hirschhorn: ถ้าวงเล็บเปิด argc ไม่เท่ากับ 3? นักเรียน 18: ใช่คุณกลับ 1 หรืออะไร เจสัน Hirschhorn: ขออภัย นักเรียน 18: ย้อนกลับ 1 หรืออะไร เจสัน Hirschhorn: ย้อนกลับ 1 OK? ยิ่งใหญ่ เปิดไฟล์ทั้งสอง ที่สามารถช่วยให้ฉันเปิดไฟล์ทั้งสอง ใครยังไม่ได้รับรหัสฉันหรือยัง เคิร์ต? KURT: ดังนั้นตัวพิมพ์ใหญ่ทั้งหมด F-I-L-E แหล่งดาว เจสัน Hirschhorn: ฉันจะ ที่จะออกจากสระ เหล่านี้จะเย็น มันก็เหมือนกับ Tumblr นักเรียน 18: เท่ากับ fopen - เจสัน Hirschhorn: เท่ากับ fopen? นักเรียน 18: เปิด paren, argv วงเล็บเปิด เจสัน Hirschhorn: รอ ขอโทษ วงเล็บเปิด ตกลง นักเรียน 18: ใช่ argv 1 ย่อย เจสัน Hirschhorn: ตำบล 1? นักเรียน 18: ใช่ argv เปิดวงเล็บ 1 - ใช่ แล้วจุลภาคแล้วเปิดคู่ อ้าง r พูดคู่ วงเล็บปิดอัฒภาค เจสัน Hirschhorn: หวาน และสิ่งที่เกี่ยวกับคนอื่น ๆ นักเรียน 18: คล้าย แต่แทนที่จะ ของ S-R-C คุณจะเรียกมันว่า D-S-T เจสัน Hirschhorn: Oo! ฉันชอบที่ นักเรียน 18: เพียงแค่ D-S-T ใช่ แล้ว argv วงเล็บเปิด 2 ใช่ แล้วน้ำหนักแทน r ใช่ เจสัน Hirschhorn: Great คู่ถัดไปของสาย นอกจากนี้ถ้าใครมีสิ่งที่จะเพิ่ม เส้นที่เราได้ทำอย่าลังเลที่จะ เพิ่มเหล่านั้นเช่นกัน ตรวจสอบให้แน่ใจว่าไม่เป็นโมฆะ ที่สามารถให้ฉันรหัสฉันต้อง ตอบสนองแนว pseudocode ที่ ธนู ธนู: ถ้า src เท่ากับเท่ากับ โมฆะหรือ dst เท่ากับเท่ากับ โมฆะแล้วคุณกลับ - เจสัน Hirschhorn: อะไรนะ? ธนู: กลับ 2? เจสัน Hirschhorn: กลับ 2 ดังนั้นหาก paren เปิด src เท่ากับ เท่ากับโมฆะหรือ - สิ่งที่ thing's - ท่อ? ท่อ? เราจะเรียกว่าท่อ ท่อท่อ dst เท่ากับเท่ากับ โมฆะกลับ 2 OK? จนกว่าเราจะออกจากไบต์ - เราเรียงลำดับของการข้ามขั้นตอนนี้จาก ส่วน pseudocode เพื่อจะไปที่นี่ แต่จนกว่าเราจะออกจากไบต์ - สิ่งที่ไม่ว่าเสียงเป็นอย่างไร สิ่งที่ประเภทของโครงสร้างซี - แต่ฉันไม่ได้ใช้โครงสร้างคำ เพราะเรากำลังจะเริ่มต้นใช้ ว่าในกรณีอื่น ๆ - แต่เครื่องมือ C เสียงที่ได้อย่างไร นักเรียน 19: ห่วง เจสัน Hirschhorn: ห่วง เสียงเหมือนห่วง ดังนั้นผู้ที่สามารถให้ฉันบรรทัดแรก วงของรหัสที่นี่? นอกจากนี้คุณยังสามารถเลือกชนิดของ วงที่คุณต้องการถ้าคุณให้ฉัน บรรทัดของรหัสนี้ มีสามชนิด คุณได้รับเลือก ฉันขอแนะนำหนึ่งในบรรดา avi ซึ่งหนึ่งคุณต้องการได้หรือไม่ AVI: สำหรับ เจสัน Hirschhorn: สำหรับ AVI: Int i เท่ากับศูนย์ เจสัน Hirschhorn: OK AVI: ส่วนนี้ผมไม่แน่ใจว่าเกี่ยวกับ แต่ฉันมีค่าน้อยกว่าขนาด แหล่งที่มาของดาว? ผมไม่แน่ใจว่าที่ เจสัน Hirschhorn: OK AVI: เพราะคุณต้องการ ขนาดของไฟล์ใช่ไหม เจสัน Hirschhorn: ดังนั้นนี้อาจจะไม่ ให้เราขนาดของจริง ยื่นไบต์ ดังนั้นอะไรที่เราควรทำอย่างไร เป็นชนิดของวงอื่นคืออะไร หรือเราควรจะยึดติดอยู่กับห่วงสำหรับ? นักเรียน 20: คุณสามารถทำวงในขณะหรือไม่ และแล้วสิ่งที่คุณต้องการทำคือ you'd - เพราะเรามี char * สำหรับแฟ้ม ดังนั้นถ้าเราเพียงแค่ให้เพิ่มขึ้นที่ จนกว่าเราจะต้องการหาอักขระที่มีค่าที่ จุดสิ้นสุดของมันได้หรือไม่ หรือไม่เป็นที่ไม่ว่าไฟล์ที่ทำงานอย่างไร เจสัน Hirschhorn: ดังนั้นเราสามารถเก็บ incrementing ถ่าน * จนกว่าเราจะหาโมฆะ - นักเรียน 20: เป็นหลักให้ไป ตัวอักษรตามตัวอักษรจนกว่าเราจะตี ส่วนท้ายของแฟ้ม เจสัน Hirschhorn: ใช่ ดังนั้นนั่นคือสิ่งที่เราต้องการจะทำ เราต้องการที่จะให้อ่านตัวอักษร ด้วยตัวอักษรจนกว่าเราจะได้รับ ส่วนท้ายของแฟ้ม นักเรียน 20: ใช่ ค้นหา - สิ่งที่สิ้นสุดหรือป้าย ที่ส่วนท้ายของแฟ้มข้อความ เจสัน Hirschhorn: OK ดังนั้นเมื่อเราได้รับการสิ้นสุดของไฟล์ - ทำอย่างไรเราจะรู้ว่าเราได้มาถึง ในตอนท้ายของไฟล์หรือไม่ ถ้าฉันโทร - จึงขอย้อนกลับไป ฟังก์ชั่นคืออะไร ลองไปที่บรรทัดนี้ที่นี่ อ่านจากแฟ้มแหล่งที่มา ที่สามารถให้ฉันบรรทัดของรหัสที่ นักเรียน 21: fscanf? เจสัน Hirschhorn: fscanf ตกลง หากฉันต้องการที่จะอ่านมาก โดยเฉพาะหนึ่งไบต์? นักเรียน 21: ผมไม่ทราบว่า เจสัน Hirschhorn: OK ได้ง่ายกว่า fscanf - สิ่งที่ - ผมต้องการที่จะอ่านจากแฟ้มแหล่งที่มา? อ่านจากแฟ้มแหล่งที่มา เป็นสิ่งที่ฟังก์ชั่น - ใช่ นักเรียน 22: มันเป็น fread? เจสัน Hirschhorn: fread ผมคิดว่าเราจะมาติดกับ สำหรับตอนนี้ที่ ชนิดของการขัดแย้ง ไม่ fread ใช้เวลา นักเรียน 22: น่าจะเป็นประเภทไฟล์ แล้วตำแหน่งในไฟล์หรือไม่ เจสัน Hirschhorn: สิ่งที่ฉันสามารถพิมพ์ที่นี่ ที่จะคิดออกว่าสิ่งที่ประเภทของการขัดแย้ง fread จะ? นักเรียนหลาย: คน fread เจสัน Hirschhorn: คน fread และ fwrite ดูเหมือนว่าพวกเขาออกไปเที่ยวด้วยกัน ดังนั้น fread ใช้อาร์กิวเมนต์กี่ นักเรียน 23: สี่ เจสัน Hirschhorn: มันจะใช้เวลา สี่ข้อโต้แย้ง มันต้องใช้ตัวชี้ขนาดและที่ สิ่งซึ่งเป็นที่แปลกและบางไฟล์ OK? ลองอ่านเกี่ยวกับมันที่นี่ "fread ฟังก์ชันอ่าน n memb องค์ประกอบของข้อมูลไบต์แต่ละขนาด ยาวจากกระแสชี้ไป สตรีมเก็บไว้ในสถานที่ ที่ได้รับจากตัวชี้. " ดังนั้นสี่ข้อโต้แย้ง ทำไมฉันจึงไม่เพียงแค่คัดลอกนี้ และวางไว้ที่นี่ ตกลง ดังนั้นผู้ที่สามารถเริ่มต้นการกรอก ข้อโต้แย้งเหล่านี้สำหรับฉันหรือไม่ avi AVI: จะออกเป็นโมฆะ เพียงแค่ใส่ src จะออกตัวชี้และดาว ใส่ src - แล้ว เจสัน Hirschhorn: ดังนั้นฉันจะหยุด คุณไปที่นั่นเพราะที่ไม่ถูกต้อง คุณขวาด้วย src แต่ ที่ src ควรจะไป? [VOICES interposing] เจสัน Hirschhorn: มันควรจะเป็น ไปกว่าที่นี่ ที่ src - src ของเราเป็นชนิด ลองดูที่นี่ นี้จะขอ * ประเภทไฟล์เรา จริงมักจะเห็นพวกเขาเช่นนั้น ดังนั้นนี่จะขอโต้แย้งของ ประเภท FILE * กระแสเรียกที่เป็น src OK? ขนาดอะไรในสิ่งที่ทำ เราต้องการที่จะอ่าน ฉันให้คุณนี้ใน คำอธิบายปัญหา นักเรียน 24: หนึ่งไบต์ในเวลา เจสัน Hirschhorn: หนึ่งไบต์ วิธีการใหญ่ไบต์คืออะไร ขนาดของมันที่อยู่ในไบต์ดังนั้นสิ่งที่ ฉันสามารถวางที่นั่น นักเรียน 25: หนึ่ง เจสัน Hirschhorn: หนึ่ง ขวา ขนาดของมันจะอยู่ในหน่วยไบต์ ดังนั้น 1 เป็น 1 ไบต์ ฉันไม่กี่ต้องการที่จะอ่านในเวลา นักเรียน 26: หนึ่ง? เจสัน Hirschhorn: สิ่งหนึ่งที่ ฉันต้องการที่จะอ่านสิ่งหนึ่งที่มีขนาด 1 หนึ่งกัดในเวลา และฉันจะใส่มันเมื่อฉันอ่านมันได้หรือไม่ นักเรียน 27: ปลายทาง? เจสัน Hirschhorn: ดังนั้นผมจึงไม่สามารถใส่ มันตรงเข้ามาในหัวข้อ นักเรียน 28: คุณจะใส่ มันเป็นตัวชี้ที่สาม นักเรียน 27: เพื่อไปยังจุดหมาย เจสัน Hirschhorn: OK ใช่ นักเรียน 29: คุณสามารถประกาศสิ่งที่จะ ทำหน้าที่เป็นที่เก็บชั่วคราวก่อนหน้านี้ เจสัน Hirschhorn: OK ให้ฉันที่ นักเรียน 29: ไฟล์อีก ชี้อาจจะ? เจสัน Hirschhorn: OK ดังนั้นนี่คือดาวเป็นโมฆะ - ก็ชนิดโมฆะดาวดังนั้นมันไม่ได้ จะต้องมีตัวชี้แฟ้ม และถ้าฉันอ่านหนึ่งไบต์ ที่จะเป็นสถานที่ที่ดี ในการจัดเก็บหนึ่งไบต์? นักเรียน 29: อาร์เรย์? เจสัน Hirschhorn อาร์เรย์ ตกลง และอะไรคือสิ่งที่เป็น เพียงแค่ขนาดหนึ่งไบต์? นักเรียน 30: char *? นักเรียน 29: ใช่ เจสัน Hirschhorn: ถ่าน * ไม่ได้เป็นหนึ่งไบต์ นักเรียน 29: ถ่าน เจสัน Hirschhorn: ถ่านเป็นหนึ่งไบต์ ใช่มั้ย? ดังนั้นขอเรียกบัฟเฟอร์นี้เป็นทั่วไป ชื่อที่ใช้สิ่งเหล่านี้ในการจัดเก็บ สิ่งชั่วคราว ดังนั้นผมจึงสร้างบัฟเฟอร์ ใช่มั้ย? แต่จะใช้เวลาเป็นโมฆะ * ดังนั้นบางทีคุณมีสิทธิที่จะ ควรจะเป็นกันชนขนาด 0 ดังนั้นจะเก็บหนึ่ง - ขวา เพราะตอนนี้ที่นี่ - ถ่าน บัฟเฟอร์เป็นตัวละคร แต่ นี้จะเป็นโมฆะ * - ตัวชี้ ดังนั้นผมสามารถทำเช่นนี้และตอนนี้ บัฟเฟอร์เป็นตัวชี้ อะไรที่ฉันจะทำอย่างไร นักเรียน 31: ใส่ดาวถัดจากถ่าน เจสัน Hirschhorn: ฉันสามารถ ได้สร้างมันถ่าน * ตกลง อะไรเป็นสิ่งที่ฉันสามารถทำอื่นได้หรือไม่ หรือให้เป็นไปด้วยนี้ char * บัฟเฟอร์ดังนั้นสิ่งที่ ฉันจะใส่ในที่นี่ นักเรียน 31: บัฟเฟอร์ เจสัน Hirschhorn: บัฟเฟอร์ บัฟเฟอร์ตัวชี้ไปยังถ่าน และอยู่ในตำแหน่งที่เรากำลังวาง หนึ่งไบต์ของสิ่งที่เราได้อ่าน ใช่ avi AVI: เพียงคำถามอย่างรวดเร็ว คุณต้องการที่จะ malloc บัฟเฟอร์? เจสัน Hirschhorn: ใครสามารถ ตอบคำถามที่ นักเรียน 32: ดีมันไม่ได้จริงๆ ชี้ไปที่อะไรตอนนี้ดังนั้น - เจสัน Hirschhorn: แต่ทำ เราต้องการที่จะ malloc มันได้หรือไม่ นักเรียน 32: ถ้าคุณได้ทำมันที่ วิธีที่ผมคิดว่าใช่เพราะคุณจะต้อง สถานที่ที่มันจะชี้ไปที่บาง เจสัน Hirschhorn: เรา ต้อง malloc มันได้หรือไม่ นักเรียน 33: หากคุณกำลังจะ ใช้มันนอกวง เจสัน Hirschhorn: พวกเราจะไป ใช้มันนอกวงหรือไม่ นักเรียน 34: ใช่ นักเรียน 35: รอ เราต้องการที่จะประกาศว่า ในวงที่จะเกินหรือไม่ เจสัน Hirschhorn: ดังนั้นผมคิดว่าเรามี หลอกบางวงในขณะที่นี่ว่าเรา พยายามที่จะคิดออกว่า เรายังไม่ได้อากาศไปยัง เราไม่จำเป็นต้อง malloc มัน เรากำลังทำงานอยู่ในหลักก็เพียงจะ เพื่อนำไปใช้ในวงนี้ มันไม่จำเป็นที่จะต้องมีอยู่ นอกนี้ เพื่อที่จะสามารถตัวแปรท้องถิ่น คุณมีตัวชี้ไปยัง ตัวแปรท้องถิ่น นักเรียน 36: แต่มันก็ไม่ได้ ชี้ไปที่อะไร เจสัน Hirschhorn: ไม่มีก็ไม่ได้ เริ่มต้นกับสิ่งใด แต่เราจะไม่ใช้มันยัง เราจะนำสิ่งที่อยู่ใน มันเป็นครั้งแรกที่เราใช้มัน เพื่อให้ดูเหมือนว่าตกลง ดังนั้นเราจึงไม่จำเป็นต้อง malloc ที่นี่ และฉันคิดว่ามันโอเคเป็น ตกลง ขณะนี้มีสาย fread ขอทำบรรทัดถัดไป ถ้าเราต้องการที่จะเขียนไปยังแฟ้มสิ่งที่เป็น ฟังก์ชั่นที่ดีที่จะใช้ในการทำเช่นนั้น นักเรียน 37: fwrite? นักเรียน 38: fprintf? เจสัน Hirschhorn: fprintf เป็นหนึ่งใน อะไรอีกหรือไม่ นักเรียน 39: fwrite เจสัน Hirschhorn: fwrite และสำหรับวัตถุประสงค์ของเรา fwrite, ซึ่งเราได้เห็นที่นี่เป็น น่าจะเป็นทางเลือกที่ดี มันใช้เวลาสี่ขัดแย้งได้เป็นอย่างดี Nishant คุณสามารถให้ ฉันขัดแย้งหรือไม่ Nishant: กำลังคนแรกของ จะเป็นเพียงบัฟเฟอร์ เจสัน Hirschhorn: OK Nishant: สองหนึ่ง ก็จะเป็น 1 หนึ่งในสามเป็นไปได้ 1 และหนึ่งในสี่เป็นไปได้ dst เจสัน Hirschhorn: ไม่มีใครมี คำถามใด ๆ เกี่ยวกับเส้นที่ ที่ดูดี ตกลง ดังนั้นตอนนี้ดูเหมือนว่าสิ่งหนึ่งที่เรากำลัง ที่หายไป - จริงให้เขียน บรรทัดสุดท้ายนี้ ปิดไฟล์ ที่สามารถเสร็จเราเขียน เหล่านี้สองบรรทัดสุดท้าย? ใช่ ขออภัยสิ่งที่ชื่อของคุณหรือไม่ ลูซี่ลูซี่ เจสัน Hirschhorn: ลูซี่ ลูซี่ src fclose แล้ว หัวข้อ fclose เจสัน Hirschhorn: fclose, วงเล็บเปิด src, paren ปิดอัฒภาค และ fclose - ใช่? ลูซี่เปิดวงเล็บ dst และอัฒภาคแล้ว เจสัน Hirschhorn: Great และสิ่งที่ฉันควรจะมีที่สิ้นสุดหรือไม่ ลูซี่กลับ 0 เจสัน Hirschhorn: กลับ 0 ฉันต้อง? เพียงคำถาม เราจะต้องมีการกลับ 0? นักเรียนหลาย: เลขที่ เจสัน Hirschhorn: เลขที่ หลักไม่ได้โดยอัตโนมัติ ถ้าคุณได้รับการสิ้นสุด แต่ผมคิดว่ามันเป็นที่ดีที่จะ รวมไว้อย่างชัดเจน โดยเฉพาะอย่างยิ่งเมื่อเรากำลังจะกลับมาอีก สิ่งที่ตลอดโปรแกรม ตกลง นี่คือสิ่งที่เราหายไป - ในขณะที่สิ่งที่ ใครจะคิดว่าบาง - มีความรู้สึกของบางสิ่ง อาจจะไปอยู่ที่นั่น? แม้ว่าจะเป็นเพียงในบาง pseudocode เช่นภาษา? สิ่งที่เป็นเราจริงๆ - สิ่งที่ เราต้องการที่จะไปจนกว่า? ใช่ลูซี่ ลูซี่ท้ายของแฟ้ม เจสัน Hirschhorn: จุดสิ้นสุดของแฟ้ม ดังนั้นสิ่งที่คุณหมายถึงโดยจุดสิ้นสุดของไฟล์ ลูซี่เมื่อคุณเข้าถึง ส่วนท้ายของแฟ้มหยุด เจสัน Hirschhorn: OK ดังนั้นเมื่อเราถึงจุดสิ้นสุดของแฟ้ม เราจะรู้ได้อย่างไรเมื่อเราได้มาถึง ในตอนท้ายของไฟล์หรือไม่ นักเรียน 40: ผมคิดว่ากันชน จะถูกตั้งค่าเป็นศูนย์ นักเรียน 41: บัฟเฟอร์มีการประกาศ ภายในวง เจสัน Hirschhorn: ดังนั้นคุณคิดว่า บัฟเฟอร์จะถูกตั้งค่าเป็นศูนย์ ทำไมจะบัฟเฟอร์ถูกตั้งค่าเป็น NULL? นักเรียน 40: เพราะเมื่อคุณ fread คุณกำลังพยายามที่จะนำ ไม่มีอะไรเป็นกันชน เจสัน Hirschhorn: OK ดังนั้นคุณกำลังคิด fread - เมื่อเราได้มาถึงจุดสิ้นสุดของ แฟ้มสิ่งที่ fread จะทำอย่างไร ผมคิดว่าเป็นคำถาม เราต้องคิดออก สิ่งที่ไม่ fread ทำอย่างไร ที่ไม่ได้ใส่โมฆะในบัฟเฟอร์หรือ ที่ไม่ได้ทำสิ่งอื่นใด วิธีที่เราสามารถคิดออกสิ่งที่มันไม่? นักเรียน 42: คน เจสัน Hirschhorn: คน เพื่อให้ดูมากกว่าที่นี่ ค่าตอบแทน ในความสำเร็จ fread และ fwrite กลับ จำนวนรายการที่อ่านหรือเขียน หมายเลขนี้เท่ากับจำนวนของไบต์ โอนเฉพาะเมื่อขนาด 1 หากมีข้อผิดพลาดเกิดขึ้นหรือจุดสิ้นสุดของ แฟ้มจะถึงค่าตอบแทนเ​​ป็น นับรายการสั้นหรือ 0 ดังนั้นสำหรับวัตถุประสงค์ของเราถ้าถึง fread ในตอนท้ายของไฟล์และอ่านจาก ส่วนท้ายของแฟ้มที่มีอะไรเหลือเป็น การอ่านสิ่งที่มันจะกลับมา? นักเรียน 43: ศูนย์? เจสัน Hirschhorn: อะไรนะ? นักเรียน 43: ศูนย์? เจสัน Hirschhorn: ศูนย์ มันจะกลับเป็นศูนย์ เพื่อให้เรารู้ fread ว่าเมื่อเราได้ ถึงจุดสิ้นสุดของไฟล์ที่เป็นไป เพื่อกลับไปเป็นศูนย์ วิธีการที่เราสามารถใช้ที่เพื่อประโยชน์ของเราหรือไม่ AVI: คุณสามารถประกาศตัวแปรภายนอก ของวงที่เรียกว่าการตรวจสอบ หากตร​​วจสอบเท่ากับ - สำหรับวันนี้ - หนึ่ง เจสัน Hirschhorn: OK AVI: และจากนั้นคุณสามารถใส่ IF งบขวาหลังจาก fread บอกว่าถ้า fread เท่ากับศูนย์ - ไม่ เจสัน Hirschhorn: ใคร สามารถช่วย Avi ออก AVI: อะไรคือค่า ส่งกลับโดย fread? เจสัน Hirschhorn: เราเพียงแค่ เดินไปที่ AVI: คุณเป็นตัวแทนของมันได้อย่างไร เจสัน Hirschhorn: ดังนั้นมันกลับ - ขอ ดูได้ที่นี่ - มันกลับ size_t ซึ่งเป็นหลัก จำนวนเต็ม ดังนั้นมันกลับจำนวนเต็ม และในกรณีของเราก็จะ กลับ 1 หรือ 0 - 1 ถ้าอ่านสิ่งหนึ่ง - หนึ่งไบต์ และ 0 ถ้าเราได้ถึงจุดสิ้นสุด ดังนั้นหาก fread - ใช่? นักเรียน 45: คุณไม่สามารถเพียงแค่ใส่เต็ม fread (บัฟเฟอร์, 1, 1, src) ลงใน ในขณะที่ห่วง? เจสัน Hirschhorn: ดังนั้นคุณเสนอ การทำเช่นนี้เป็นมี [VOICES interposing] เจสัน Hirschhorn: ยึดมั่นใน ดังนั้นเรา ridding ของที่ ดังนั้นคุณเสนอวาง fread เข้าไปมี? สิ่งที่เราควรจะย้าย ถ้าคุณต้องการที่จะทำเช่นนั้น นักเรียน 45: บัฟเฟอร์นอก เจสัน Hirschhorn: เราควร ยังย้ายนี้ออกจากที่นี่ นักเรียน 45: แต่ไม่ว่าอย่างต่อเนื่อง ย้ายไปข้างหน้า [VOICES interposing] เจสัน Hirschhorn: OK ดังนั้นนี่คือสิ่ง Okshar เสนอ เราสร้างบัฟเฟอร์ของเรา ในขณะที่เรา fread แล้วเรา fwrite ความคิดเกี่ยวกับเรื่องนี้? นักเรียน 46: คำถามเดียวของฉันคือจะ มันจริง fread รันคำสั่งหรือไม่ เจสัน Hirschhorn: Great คำถาม เมื่อคุณวางสายงาน ภายในสภาพไม่ว่า การเรียกใช้ฟังก์ชันรัน เราได้เห็นตัวอย่างของการนี​​้มาก่อน ใช่มั้ย? นักเรียน 46: ตกลง ใช่ จึงไม่ดำเนินการ เจสัน Hirschhorn: เราได้เห็นสิ่งที่ เช่นว่าก่อนที่เรามี การเรียกใช้ฟังก์ชันภายในของสภาพ ไม่เรียกใช้ฟังก์ชันที่รัน ใช่ ดังนั้นคำตอบคือใช่ การเรียกใช้ฟังก์ชันนี้จะดำเนินการ แต่อีกครั้งก็เป็นสิ่งที่เราต้องการได้หรือไม่ สิ่งที่เป็นวิธีหนึ่งที่เราสามารถคิด ว่ามันคือสิ่งที่เราต้องการได้หรือไม่ นักเรียนหลาย: เรียกใช้มันได้หรือไม่ เจสัน Hirschhorn: เราสามารถเรียกใช้มัน แต่ก่อนที่เราจะทำอย่างไรที่เราจะทำได้ นอกจากนี้ยังมีเหตุผลผ่านทางนี้ ถ้า - ว่าเรามีหนึ่งไบต์ในของเรา ไฟล์เราจะให้ที่นี่ เราจะให้รหัสนี้ นี้จะทำงาน fread จะกลับหนึ่งไบต์และ เก็บไว้ในบัฟเฟอร์ และจะประเมินถึง 1, ขวาหลังจากที่เขากลับมาที่ 1 ดังนั้นในขณะที่ 1 ไม่ว่าหมายถึงรหัสภายใน วงในขณะที่จะรัน นักเรียน 47: ใช่ มันเป็นความจริง เจสัน Hirschhorn: ใช่ 1 เป็นความจริง มันไม่ 0 ดังนั้นรหัสภายในที่นี่จะดำเนินการ ดังนั้นเราจะเขียนว่า เราจะย้ายกลับไปนี้ สายอีกครั้ง ตอนนี้เรามี - เราอยู่ที่ส่วนท้ายของแฟ้มของเรา เราอ่านจากจุดสิ้นสุดของไฟล์ของเรา เพราะเรามีเพียงหนึ่งไบต์ในนั้น fread กลับ 0 ร้านค้า บางสิ่งบางอย่างในบัฟเฟอร์ ฉันสุจริตไม่ทราบว่าสิ่งที่ จะเก็บในบัฟเฟอร์ เราอาจจะมองขึ้นไป เพื่อดูสิ่งที่มันไม่ ที่ฉันสุจริตไม่ทราบว่า เราไม่ทราบที่ใส่ใจสิ่งที่ จะเก็บในบัฟเฟอร์? แต่มันก็ไม่กลับ 0 และจะดำเนินการในขณะที่ 0? ในขณะที่ 0 จะไม่ดำเนินการ ดังนั้นแล้วเราจะย้ายไปลงที่นี่ จึงขอได้แสดงของมือที่ว่านี้ เป็นรหัสที่เราควรจะทำงานหรือถ้าเรา ควรจะทำอย่างไรการเปลี่ยนแปลงครั้งแรก ดังนั้นถ้าคุณคิดว่า - คุณมีการลงคะแนนเสียง หากคุณคิดว่าเราควรเรียกใช้รหัสนี้ ตามที่เป็นอยู่โปรดยกมือของคุณ ตกลง มีหนึ่ง - คุณมีคำถามความกังวล? ใช่ นักเรียน 48: หลังจากที่เราย้ายบัฟเฟอร์ นอกวงเราทำ ต้อง malloc มันได้หรือไม่ เจสัน Hirschhorn: Great คำถาม หลังจากที่เราย้ายไปที่ด้านนอกของกันชน วงเราจะต้อง malloc มันได้หรือไม่ นี่คือคำถามที่ขอบเขต ถ้าเราเริ่มต้น buffer นอก ของวงนี้ก็จะมีอยู่ ด้านในของวงหรือไม่ นักเรียนหลาย: ใช่ เจสัน Hirschhorn: ใช่ ขอบเขตที่ครอบคลุมด้านในของวง และจริงๆสิ่งที่อยู่ด้านล่างภายใน ของรหัสนี้รวมถึง สิ่งที่อยู่ข้างในที่นี่ ดังนั้นเราจึงไม่จำเป็นต้อง malloc มัน มันเป็นตัวแปรท้องถิ่นและขอบเขตของ รวมถึงยังคงห่วง นักเรียน 49: เราจำเป็นต้องที่จะเป็นอิสระได้หรือไม่ เจสัน Hirschhorn: เรา ต้องบัฟเฟอร์ฟรีหรือเปล่า นักเรียน 49: ใช่ถ้าเราไม่ malloc เจสัน Hirschhorn: เรา ต้องบัฟเฟอร์ฟรีหรือเปล่า ที่เราทำไม่ได้ อีกครั้งก็เป็นตัวแปรท้องถิ่น ดังนั้นเราจึงไม่จำเป็นต้องเป็นอิสระ ตกลง ลองดูสิ่งที่เกิดขึ้น ดังนั้นจึงเป็นสิ่งที่ไม่ได้เตรียม นั่นคือสิ่งที่สิ่งที่ มาร์คัสเสนอก่อนหน้านี้ ดังนั้นเราจึงมีข้อผิดพลาดที่บัฟเฟอร์ตัวแปร เป็น uninitialized เมื่อนำมาใช้ที่นี่ วิธีที่เราสามารถแก้ไขปัญหานี้ นักเรียน 50: malloc มันได้หรือไม่ นักเรียน 51: เท่ากับโมฆะ? นักเรียน 52: บัฟเฟอร์พูดเท่ากับโมฆะ เจสัน Hirschhorn: OK ดูดี เรามีตอนนี้ ลองสร้างสิ่งที่จะพยายามคัดลอก ดังนั้นเราจึงมีแฟ้มข้อความของเรา วิธีการที่เราสามารถเรียกใช้โปรแกรมนี้ ใช่ นักเรียน 53: คุณสามารถทำจุด เฉือน cp, test.txt และจากนั้นคุณสามารถตั้งชื่อไฟล์อื่น ซึ่งมันจะเก็บเป็น เจสัน Hirschhorn: OK เราจะเรียกว่า out.txt เย็น ความผิด seg ความคิดเกี่ยวกับความผิด seg ของหรือไม่ นี้ดีมาก วิธีที่เราสามารถหาที่ seg ​​ของความผิดคืออะไร คืออะไร? นักเรียน 54: GDB เจสัน Hirschhorn: GDB เราทำงานโดยการเขียน gdb gdb จุดเฉือน, ชื่อของโปรแกรมของเรา ไม่มีอาร์กิวเมนต์บรรทัดคำสั่งมี เรากำลังจะตั้ง จุดพักที่หลัก ถ้าผมต้องการที่จะเริ่มต้น gdb สิ่งที่ฉันจะทำอย่างไร นักเรียน 55: อาร์ เจสัน Hirschhorn: อาร์และแล้วสิ่งที่ นักเรียน 55: ข้อโต้แย้ง? เจสัน Hirschhorn: แล้ว อาร์กิวเมนต์บรรทัดคำสั่ง ลองเดินผ่าน ยังไม่มีเป็นเพียงการพาผมทีละบรรทัด ฉันจะไปจนกว่า ฉันจะได้รับความผิด seg ของฉัน มีความผิด seg ของฉัน ดูเหมือนว่า fread เกิด ความผิด seg ของฉัน ฉันรู้ว่าเกิดความผิด fread seg ของฉัน เพราะเห็นว่าเป็น สายเราก็ดำเนินการ และสิ่งเดียวที่เป็น ที่เกิดขึ้นในบรรทัดที่ - สองสิ่งที่เกิดขึ้น fread เป็นไปแล้วเรา ทำในขณะที่บางการตรวจสอบ ฉันยินดีที่จะเดิมพันว่าในขณะที่ การตรวจสอบก็ไม่ได้ก่อให้เกิดความผิด seg ของฉัน ส่วนใหญ่แล้วเป็น fread ก่อให้เกิดความผิด seg ของฉัน ฉันยังเห็นบางสิ่งบางอย่างที่นี่ memcopy สำเนาหน่วยความจำ เสียงเหมือนการย้ายหน่วยความจำจาก สถานที่หนึ่งไปยังอีก เสียงเหมือนอะไรบางอย่างที่จะเกิดขึ้น ใน fread อาจหน่วยความจำบาง ย้ายจากที่นี่ไปที่นี่ ให้เป็นไปผ่านทางนี้อีกครั้ง ฉันจะเริ่มต้นมันมากกว่า และเรียกใช้อีกครั้งหรือไม่ ใช่ นักเรียน 56: คุณจะต้องใส่ เครื่องหมายก่อนบัฟเฟอร์? เจสัน Hirschhorn: ดังนั้นเครื่องหมายก่อน บัฟเฟอร์จะให้ฉันที่อยู่ของ บัฟเฟอร์ซึ่งเป็นถ่าน * ขอใช้ผ่านทางนี้อีกครั้งหนึ่ง ฉันจะทำงานผ่านมันได้อีกครั้งหนึ่ง นักเรียน 57: คุณสามารถเพียงแค่ พิมพ์ที่ทำงานอีกครั้งหรือไม่ เจสัน Hirschhorn: เพียงพิมพ์การทำงานอีกครั้ง ดังนั้นเราจะไม่ รันบรรทัดนี้ ดังนั้นบัฟเฟอร์เป็นตัวชี้โมฆะ ถูกต้องหรือไม่ มันจะชี้ไปที่ - เรามาดู ถ้าเรามีเรา - วาดภาพได้อย่างรวดเร็วนี้ ทุกคนสามารถดูได้ว่า ที่ผมเขียนไปที่นี่? ดังนั้นในกองเรามีในท้องถิ่น ตัวแปรและก็เรียกว่าบัฟเฟอร์และ เป็นตัวชี้ไปยังถ่าน อะไรที่อยู่เป็นถ่านนี้ที่? นักเรียน 58: 0x0 เจสัน Hirschhorn ขวา นั่นคือสิ่งที่เป็น ในที่นี่ภายในบัฟเฟอร์จะถูกเก็บไว้ 0x0 นั่นคือสิ่งที่เรามี - การตั้งค่าที่เรามีตอนนี้ ดังนั้นบรรทัดนี้ fread ทำให้บางสิ่งบางอย่าง จากแหล่งที่มาอยู่ที่ไหน ลงในช่องนี้หรือกล่องนี้ กล่องไหน กล่องหรือกล่องด้านขวาซ้าย ช่องขวานี้ มันเป็นไปตามตัวชี้ และทำให้มันอยู่ในที่นี่ เมื่อเราพยายามและหน่วยความจำสัมผัสที่ สถานที่ 0, สิ่งที่เราได้รับ ความผิดส่วน นั่นคือความผิดพลาดที่เรามีตอนนี้ ใช่ นักเรียน 59: คุณไม่ได้ ใส่กันชนดาว? หรือไม่ได้หรือไม่ สำหรับ fread? เจสัน Hirschhorn: ดังนั้น fread ใช้ตัวชี้ ดังนั้นมันผ่านในบัฟเฟอร์ และจากนั้นก็จะยกเลิกการอ้างอิง มันอยู่ที่ไหนสักแห่งภายใน fread แต่อีกครั้งที่เราเห็นก็จะใช้เวลาชี้ เราไม่จำเป็นที่จะผ่านมันบัฟเฟอร์ดาว ที่จะผ่าน มันสิ่งที่นี่ และนั่นอาจจะทำให้เรามีข้อผิดพลาด เพราะเรากำลังยกเลิกการอ้างอิงนั้น ใช่มั้ย? เมื่อเรายกเลิกการอ้างอิงตัวชี้นี้เมื่อ เราพยายามที่จะเข้าสู่ตำแหน่งนี้ เราได้รับข้อผิดพลาด - ความผิดส่วนของเรา ดังนั้น - อุ่ย เรากำลังจะออกจาก gdb สายของเรา - ปัญหาของเรา - ที่ถูกต้อง ที่นี่ในสายนี้ และมันก็เป็นปัญหาเพราะ ของสายนี้ วิธีที่เราสามารถสร้างกล่องที่ สามารถเข้าถึงได้ใน fread ใช่มั้ย? เราจำเป็นต้องสร้างกล่องที่หนึ่ง ไบต์ขนาดใหญ่ขนาดของถ่าน แต่เราจำเป็นต้องกล่องที่จะสามารถเข้าถึง เมื่อฟังก์ชั่นนี้ดำเนินการ เพื่อที่ - ใช่ ความคิดใด? นักเรียน 60: เพียงแค่ตั้งค่าเป็น ตัวอักษรแบบสุ่มใด ๆ เพียงแค่ทำเท่ากับบัฟเฟอร์ถ่าน ตัวละคร และจากนั้นเมื่อคุณได้ buffer มี - เจสัน Hirschhorn: รอ ถ่าน buffer? จึงไม่มีดาว? นักเรียน 60: ใช่ จะออกจากดาว เท่ากับเป็นตัวละครที่สุ่ม เจสัน Hirschhorn: OK เพื่อให้ฉันหนึ่ง นักเรียน 60: เหมือนหรือสิ่งที่ และจากนั้นเมื่อคุณมีบัฟเฟอร์ มีคุณใช้ - นักเรียน 61: สตาร์? โอ้ไม่เครื่องหมาย นักเรียน 60: ใช้เครื่องหมาย เจสัน Hirschhorn: OK และสิ่งที่เกี่ยวกับใน fwrite? นักเรียน 60: ใช้เครื่องหมายอีกครั้ง เจสัน Hirschhorn: ทั้งหมดขวา ดังนั้นความคิดของคุณก็คือเราสร้างถ่านและ นำสิ่งที่อยู่ในนั้นแล้ว เขียนถึงถ่านที่ นักเรียน 60: ใช่ เจสัน Hirschhorn: อะไร คนคิดว่า นักเรียน 62: มันซับซ้อน เจสัน Hirschhorn: OK ลองวาดมันออกมา ดังนั้นเวลานี้ฉันจะวาดนี้ใน สีแดงบนสแต็คที่นี่แล้วเรา จะมี - โอ! ขอโทษ ดังนั้นเวลานี้เรามีสิ่งที่เรียกว่า buffer และก็ในกอง ถูกต้องหรือไม่ และเรากำลังบันทึกอยู่ในนั้นในตอนแรก แล้วเรามีการเรียกร้องของเราที่จะ fread สิ่งที่ fread ไม่เป็นก็จะใช้เวลาไบต์จาก ไฟล์ของเราและทำให้มันอยู่ที่ไหนสักแห่ง มันทำให้มันในสิ่งที่ ชี้สิ่งที่จะ ดีก่อนที่เราจะมีที่อยู่นี้ - 0x0 ตอนนี้เราทำในสิ่งที่อยู่มี นักเรียน 63: สิ่งที่ บัฟเฟอร์ที่อยู่เป็น เจสัน Hirschhorn: สิ่งที่ บัฟเฟอร์ที่อยู่เป็น มันอาจเป็นไปได้ สิ่งที่ต้องการที่ อาจจะเริ่มต้นด้วย b และ ฉแล้วมีหกอื่น ๆ เลขฐานสิบหก ไม่สำคัญ ที่อยู่บาง และเรากำลังผ่านอยู่ที่ค่ะ และเรากำลังจะใส่หนึ่งของเรา สิ่งไบต์ตามที่อยู่ที่ ดังนั้นเราจะใส่หนึ่งของเรา สิ่งไบต์ภายในที่นี่ แล้วเรากำลังจะเขียนจาก สิ่งที่เคยอยู่ในที่นี่ ไม่มีใครมีคำถามใด ๆ เกี่ยวกับที่ ที่คิดว่ารหัสนี้จะทำงานอย่างไร ยกมือของคุณถ้าคุณคิด รหัสนี้จะทำงาน คุณต้องใช้ท่าทาง และผู้ที่คิดว่ารหัสนี้จะไม่ทำงาน ยกมือของคุณ คนอื่น ๆ ที่ควรจะเป็น ยกมือของพวกเขา ตกลง ไมเคิลที่คุณยืน ไมเคิล: ผมไม่สามารถตัดสินใจ ชนิดของที่อยู่ตรงกลาง เจสัน Hirschhorn: คุณ อยู่ตรงกลาง เลือกหนึ่ง ไมเคิล: ผมจะมีความเชื่อ และบอกว่ามันจะทำงาน เจสัน Hirschhorn: OK คุณจะมีความเชื่อและบอกว่ามันทำงานอย่างไร สิ่งที่เกิดขึ้น [VOICES interposing] เจสัน Hirschhorn: ไม่มีความผิด seg ของ วิธีการที่เราสามารถตรวจสอบเพื่อดูว่า สองสิ่งที่เท่ากัน สองไฟล์เท่ากัน นักเรียน 64: ความแตกต่าง เจสัน Hirschhorn: Diff การตรวจสอบความแตกต่างสำหรับความแตกต่างระหว่าง สองไฟล์และถ้ามันกลับ ไม่มีอะไรที่พวกเขากำลังเหมือนกัน และถ้าเราเปิดขึ้นเราได้รับไฟล์ของเรา เพื่อให้เป็นวิธีที่ถูกต้อง ลองมองย้อนกลับไปที่มันอีกครั้งหนึ่ง เราไม่จริงไม่ได้ จำเป็นที่จะต้องเริ่มต้นมัน มันอาจจะดูเล็กน้อย ทำความสะอาดถ้าคุณไม่ได้ใส่ สิ่งที่สุ่มอยู่ในที่นั่น ชี้ถูกคุณจำเป็นในการสร้าง พื้นที่ในการจัดเก็บบางสิ่งบางอย่างจากบางส่วน fread และนำสิ่งที่ ออกจาก fwrite และสิ่งที่จะต้องมีทั้งในประเทศ ตัวแปรในสแตก - คุณ อาจได้ malloc'd พ​​ื้นที่บางส่วน ดังนั้นเราจริงอาจมี เขียน malloc ที่นี่และ ที่จะได้ทำงาน แล้วเราจะได้รับการจัดเก็บ สิ่งที่เราอยู่ที่ไหนสักแห่งในกอง แต่นี้เป็นจริงอาจจะ ทางออกที่สง่างามมากที่สุด เพียงแค่สร้างพื้นที่บนสแต็คบาง เพราะสิ่งเหล่านี้จะไป ฉันจะมีสองความคิดเห็นอื่น ๆ ถ้าคุณจะเปิดในนี้และ แล้วได้รับคะแนนเกี่ยวกับเรื่องนี้ความคิดเห็นของฉัน จะเป็นดังนี้ 1 เหล่านี้ของที่นี่ให้ฉันดู เช่นหมายเลขมายากล 1 ในแง่ของ fread, ทำให้รู้สึก นั่นคือจำนวนของสิ่ง จะอ่านหรือเขียน แต่หนึ่งในที่นี่นี้ควร อาจจะเป็นอย่างอื่น ดังนั้นสิ่งที่เป็นวิธีการแก้ปัญหาอย่างใดอย่างหนึ่ง นักเรียน 65: ขนาดของไบต์ เจสัน Hirschhorn: เช่นเดียวกับที่ นักเรียน 65: ขนาดของถ่าน เจสัน Hirschhorn: ขนาดของถ่าน ใช่ไบต์ไม่ได้เป็นประเภท ดังนั้นขนาดของผลงานถ่าน เราจะได้มีที่ด้านบนของ รหัสของเรา, # กำหนดว่า สิ่งที่เรียกว่าไบต์และ ก็จริงๆถ่าน ที่จริงแล้ววิธีการที่ดียิ่งขึ้น อาจจะได้รับนี้ - uint ใครรู้ว่าสิ่งที่เป็น? ขอโทษ ฉันมีมันไปข้างหลัง รอไม่ ก็ไม่ทางไหนที่ไป? ใครรู้ว่าสิ่งที่เป็น? ใช่ นักเรียน 67: ควรที่จะช่วยสร้างมาตรฐาน เจอสิ่งที่ระบบ มี - เช่นจำนวนเต็มไม่ได้ลงนาม ที่มี 8 ไบต​​์? เจสัน Hirschhorn: นั่น ตรงขวา บนเครื่องที่แตกต่างกัน ขนาดของถ่าน - มักจะไม่ได้ถ่าน ตัวอักษรที่มักจะมีหนึ่งไบต์ แต่ขนาดของชนิดข้อมูลอื่น ๆ ที่มี ขนาดแตกต่างกันบนเครื่อง 32 บิต เมื่อเทียบกับเครื่อง 64 บิต uint8_t เสมอ 8 บิต - เสมอหนึ่งไบต์ และฉันต้องการที่จะรวมถึงที่ ไฟล์ส่วนหัว int มาตรฐาน ดังนั้นตอนนี้จะได้รับน่าจะเป็น วิธีที่ดีที่สุดที่จะเขียนรหัสนี้ ดังนั้นฉันจะกำจัดของตัวเลขมหัศจรรย์ และฉันยังมีตรรกะมากขึ้น ประเภทการบัฟเฟอร์ มันไม่ได้เป็นเพียงถ่านเป็นไบต์ ซึ่งเป็นสิ่งที่เราคาดหวังให้เป็น และที่นี่เราได้จริง รับบิตที่แข็งแกร่งมากขึ้น เราไม่ได้เรียกมันว่าถ่านซึ่ง - บางทีใครจะรู้ - ที่อาจจะแตกต่างกัน ขนาดในเครื่องที่แตกต่างกัน เรากำลังจริงว่าตรงนี้เป็น หนึ่งไบต์เสมอไม่ว่าสิ่งที่ และถ้าเราดูที่นี่เราทำ cp เอ่อโอ้ สิ่งที่เกิดขึ้น นักเรียน 68: มันอาจจะเปลี่ยน เจสัน Hirschhorn: อะไรนะ? นักเรียน 69: มันคืออะไร นักเรียน 70: คุณไม่ได้ กำหนดเป็นประเภท นักเรียน 71: แต่มันควรจะเป็น ได้รับการกำหนดไว้ในมาตรฐาน นักเรียน 72: สิ่งที่เกิดขึ้น? นักเรียน 73: ควรจะกำหนดเป็นตัวพิมพ์ใหญ่ทั้งหมดหรือไม่ เจสัน Hirschhorn: ดังนั้นจึงไม่ # define ที่จริงในกรณีนี้ผม จะใช้ typedef เพราะเรากำลังจะใช้มันเป็น ประเภทในสถานที่หนึ่ง ดังนั้นในกรณีนี้เราต้องการจริง typedef เหมือนเรากำลังพิมพ์รูปแบบใหม่ ไบต์และมันก็เป็นหลักนี้ เป็นบิตที่แตกต่างจาก # กำหนด และตอนนี้รหัสของเราทำงานอย่างสมบูรณ์แบบ ดังนั้นอีกครั้ง # กำหนดจะใช้เวลาบางสิ่งบางอย่าง แทนที่มันทุก กับสิ่งอื่น ๆ มันเป็นเพียงแมโคร - ชวเลขในการกำจัดของตัวเลขมหัศจรรย์ แต่ในกรณีนี้เพราะเรา ใช้มันเป็นชนิด - ที่นี่ - เพื่อให้การทำงานที่เราต้องการ การ typedef สิ่งที่เป็นไบต์ และเรากำลังกำหนดมันที่นี่ มันไม่ struct ก็จริง เพียงจำนวนเต็ม มันเป็นหนึ่งในไบต์ยาว รหัสนี้จะมีออนไลน์และ ทุกท่านควรจะมีได้ในขณะนี้ ดังนั้นเราจึงมี - ที่สมบูรณ์แบบ - 13 นาทีที่เหลือที่จะไป กว่าปัญหาตั้ง 5 ผมต้องการที่จะเดินผ่าน copy.c กัน และจากนั้นเราจะพูดสั้น ๆ เกี่ยวกับส่วนอื่น ๆ ของปัญหาที่กำหนด เพื่อให้ฉันดึงขึ้น copy.c. และสิ่งที่น่าสนใจคือเราได้จริง เขียนแล้วจำนวนมากของรหัสนี้ รหัสที่เราเขียนอย่างแท้จริงเพียง ออกจากที่นี่มาเมื่อฉันถูก เขียนนี้ของฉันเอง แต่นี้เป็น copy.c, รูปแบบพื้นฐาน สำหรับสองส่วนแรกของ ปัญหาที่กำหนดไว้สำหรับ whodunit.c ซึ่ง คุณจะต้องเขียนและ resize.c Recover.c ซึ่งเป็นสามและครั้งสุดท้าย ส่วนหนึ่งของชุดปัญหาไม่ได้ ตามออกของไฟล์นี้ คุณจะต้องเขียนไฟล์ที่ เราจะให้คุณแม่แบบสำหรับการที่ ยื่น แต่มันมีอะไร จะทำอย่างไรกับ copy.c. แต่เนื่องจาก copy.c เป็นพื้นฐานสำหรับ สองส่วนแรกที่เรากำลังจะ จะเดินผ่านได้ในขณะนี้เพื่อให้คุณมี ความรู้สึกที่ดีของสิ่งที่มันไม่ และแสดงความคิดเห็นให้บางส่วนของมันออกไป เราได้เขียนแล้วบางส่วนของนี้ ครั้งแรกที่เราทำให้แน่ใจว่า เราได้รับข้อโต้แย้งที่สาม ต่อไปเราจะจดจำชื่อไฟล์ ดังนั้นเราจึงข้ามขั้นตอนนี้เมื่อ เราเขียนสิ่งที่เรา - เมื่อ cp ของเรา แต่ที่นี่พวกเขากำลังทำ มันทำความสะอาดบิต พวกเขากำลังตรวจสอบเพื่อให้แน่ใจว่า ไฟล์ทั้งสองดีใน นอกเหนือไปจากการเปิดให้ เราเขียนรหัสทั้งหมดนี้เพียงแค่ตอนนี้ดังนั้นฉัน ไม่ได้ไปอาศัยอยู่ในรหัสนี้ ต่อไปคือสิ่งที่เฉพาะบางอย่าง ประเภทของไฟล์ที่เรากำลังใช้ซึ่ง เป็นไฟล์บิตแมป แฟ้มบิตแมปมีข้อมูลบางส่วน เกี่ยวข้องกับพวกเขา ดังนั้นคู่แรกของไบต์ บอกคุณเกี่ยวกับไฟล์ พวกเขาจะไม่สีของ พิกเซลในภาพที่ พวกเขาบอกคุณเกี่ยวกับไฟล์ และถ้าคุณอ่านผ่านชุดปัญหา คุณจะมีข้อมูลมากขึ้น เกี่ยวกับประเภทของโครงสร้างข้อมูล จะมาพร้อมกับบิตแมป แต่นั่นเป็นเหตุผลที่เรามีเป็นครั้งแรกนี้ ชุดของ - รหัสนี้ที่นี่ เรากำลังอ่านเมตาดาต้า - สองชิ้นของเมตาดาต้า - ไฟล์ ส่วนหัวและส่วนหัวของข้อมูล และเราจะตรวจสอบบางส่วนของมันที่จะ ให้แน่ใจว่ามันเป็นไฟล์บิตแมปที่แท้จริง ก่อนดำเนินการต่อ และอีกครั้งเหล่านี้เป็นรายละเอียดที่เรา ไม่จำเป็นต้องไปลงในขณะนี้ ถ้าคุณอ่านผ่านชุดปัญหา คุณจะเข้าใจเหล่านี้ เรื่องยาวสั้นเหล่านี้เป็นเพียงการพูดว่า นี้เป็นไฟล์บิตแมปและ ยืนยันว่า ต่อไปเรากำลังเขียนเหล่านั้น ไฟล์ออก เราจะเห็นว่าที่นี่ เรากำลังเขียนถึงตัวชี้ออก ต่อไปเราจะกำหนดช่องว่างภายใน ดังนั้นอีกครั้งเป็นพิเศษด้วย ไฟล์บิตแมปเส้นบางรวมถึง padding ที่สิ้นสุด และถ้าคุณอ่านผ่านชุดปัญหา คุณจะได้เรียนรู้เพิ่มเติมเกี่ยวกับช่องว่างภายใน นี้คือสูตรที่จะหาช่องว่างภายใน สำคัญที่ต้องจำ - เมื่อคุณเปลี่ยนขนาดของบิตแมป ไฟล์ที่มีการเปลี่ยนแปลงช่องว่างภายใน เมื่อคุณเปลี่ยนขนาดของ ไฟล์ที่มีการเปลี่ยนแปลงช่องว่างภายใน มันไม่เคยไปได้ สูงกว่า 3 - มันจะเป็น 0 ถึง 3 รวม แต่เมื่อคุณเปลี่ยนขนาดของ บางสิ่งบางอย่างที่มีการเปลี่ยนแปลงช่องว่างภายใน ถ้าฉันมีเพียงหนึ่งพิกเซลในแถวที่ผม ต้องสามไบต์ของ padding เพราะ แต่ละแถวจะต้องมีคูณสี่ ไบต์ยาวในไฟล์บิตแมป แต่ถ้าฉันเป็นสองเท่ามันจะไปจากที่หนึ่งพิกเซล สองพิกเซลซึ่งแต่ละ, สมมติว่าเป็นไบต์แล้วฉันต้องการ สองไบต์ของการขยายที่จะทำให้ ที่เท่ากับสี่ ดังนั้นเมื่อผมเปลี่ยนขนาดของบางสิ่งบางอย่าง ฉันต้องการที่จะเปลี่ยนจำนวนเงิน ของการขยายฉันมี ไม่ว่าทำให้ความรู้สึกที่ทุกคนหรือไม่ ต่อไปเราจะย้ำกว่าแต่ละแถว หรือผ่านแถวทั้งหมด แล้วเราย้ำผ่าน แต่ละคอลัมน์ในแต่ละแถว เรากำลังรักษาบิตแมปนี้เช่น ตารางเช่นเดียวกับที่เราเคยได้รับการรักษา คณะกรรมการใน 15 เหมือนอย่างที่เราได้รับการรักษาอิฐเมื่อ เราพิมพ์พวกเขาบนหน้าจอ ตารางของแถวและคอลัมน์ - แล้วที่เราเห็นนี้ เราจริงเพียงแค่เขียนนี้ เราได้สร้างที่เก็บชั่วคราวบางส่วน เราอ่านในนั้นแล้ว เราเขียนมันออกมา ตรงนี้เป็นสิ่งที่เราเพิ่งได้ ต่อไปเพราะผมบอกว่าแต่ละบรรทัด จะสิ้นสุดลงในช่องว่างบางอย่างเรา ข้ามช่องว่างภายในที่ - padding เก่า แล้วเราเพิ่มกลับ ในกรณีนี้เรากำลังสร้าง ไฟล์ที่แน่นอนเดียวกัน เราเพียงแค่การคัดลอก ดังนั้นสายนี้เป็นชนิดของโง่ เราสามารถแท้จริงเพียง ใส่ช่องว่างค่ะ แต่ถ้าคุณเปลี่ยนขนาดของไฟล์ คุณยังคงต้องการให้บรรทัดนี้ ดังนั้นหากเราเปลี่ยนขนาดของไฟล์ที่ เราจะยังคงต้องการที่จะข้าม กว่า padding เก่าหรือไม่ นักเรียน 74: ใช่ เจสัน Hirschhorn: ดังนั้นที่เราทำ เพราะสิ่งนี้อีกครั้งข้อเสนอ ด้วยแฟ้มแหล่งที่มา เราไม่ได้ดูแลเกี่ยวกับช่องว่างภายใน จากแฟ้มแหล่งที่มา เราต้องการที่จะไปที่บรรทัดถัดไป แต่เราไม่ได้ใส่เพียงกลับ จำนวนเงินเดิมของการขยาย เราต้องการที่จะนำกลับ จำนวนใหม่ของการขยาย ดังนั้นเมื่อเรากำลังจะเปลี่ยนขนาดของ ไฟล์เรายังคงต้องการที่จะข้าม padding ในแฟ้มเก่า - สิ่งที่ เรากำลังอ่านจาก แต่สิ่งที่เรากำลังเขียนถึงเราจะ ที่จะต้องนำกลับมาบางส่วนที่แตกต่างกัน จำนวนของการขยายที่ เราได้กำหนด ใช่ นักเรียน 75: คำสั่งของทั้งสอง สายไม่เป็นไรใช่มั้ย เพราะคุณกำลังจัดการ ไฟล์ที่แตกต่างกัน เจสัน Hirschhorn: แน่นอน คำสั่งของทั้งสองสาย ไม่สำคัญ เราเขียนบรรทัดนี้ นี้เป็นที่นี่เพื่อดูไฟล์ เรากำลังเขียนถึง นั่นเป็นสิ่งสำคัญเพื่อที่เราได้รับ ในปริมาณที่เหมาะสมของการขยาย นี้มีการจัดการกับไฟล์ใน เราต้องการที่จะข้ามไปทางด้านขวา ผ่านช่องว่างภายใน เราไม่ต้องการที่จะอ่าน - ถ้าเรากำลังอ่านไบต์ในเวลาที่เรา ไม่สนใจเกี่ยวกับผู้ไบต์ padding เราต้องการที่จะย้ายไปยังบรรทัดถัดไป ในที่สุดเช่นเดียวกับลูซี่ให้สำหรับเรา เราปิดไฟล์และ return 0 ดังนั้นนี่คือ copy.c. และเราจริงเขียน - เราใช้เวลาส่วนใหญ่ของ เขียนนี้เป็นหลักส่วน คุณทำนี้ เพื่อหวังว่าคุณจะมีความรู้สึกที่ดี ของสิ่งที่เกิดขึ้นที่นี่ ความแตกต่างใหญ่ตรงไปตรงมาเป็นเพียง ส่วนแรกนี้ที่เกี่ยวข้องกับ ลักษณะของแฟ้มบิตแมป ดังนั้นผมจึงมีเป็นสไลด์ต่อไปของฉัน สิ่งที่เราจะต้องทำอย่างไร ดีขอคิดเกี่ยวกับการสืบสวนสอบสวน และสำหรับคนที่อ่านผ่าน ปัญหาที่กำหนดสิ่งที่เราทำ ต้องทำสืบสวนสอบสวน? เพียงแค่ aleja aleja: คุณสามารถนำออกไปส่วนหนึ่ง ของพิกเซลที่หมายถึงสีแดงแต่ละ แล้ว - ชนิดของ? เจสัน Hirschhorn: OK ดังนั้นจะออกเป็นส่วนหนึ่งของแต่ละ พิกเซลที่หมายถึงสีแดง ที่ใกล้ชิด แต่ไม่ทั้งหมดของมัน นักเรียน 76: ดีมี วิธีการที่แตกต่างกันที่จะทำมัน เจสัน Hirschhorn: OK ให้ฉันวิธีหนึ่ง นักเรียน 76: จะออกทั้งหมดสีแดงและ แล้วเน้นสีฟ้าและสีเขียว เจสัน Hirschhorn: OK ให้ดังนั้นทั้งสองวิธีการเหล่านี้ - ดูเหมือนเราจะให้มันพิกเซลมัน มีระดับสีแดง, สีฟ้า, สีเขียวและ เราต้องการที่จะเปลี่ยนระดับความสัมพันธ์ของ สีแดง, สีฟ้า, สีเขียวและขึ้นอยู่ บนพิกเซลที่ ที่ไหนในรหัสนี้เราควรจะเปลี่ยน ญาติสีแดง, สีฟ้า, สีเขียวและ ระดับของพิกเซลที่กำหนด หลังจากที่เราได้อ่านมัน - ก่อนที่เราจะเขียนมันได้หรือไม่ ให้ฉันหมายเลขบรรทัด นักเรียนหลาย: 83 เจสัน Hirschhorn: 83 ดังนั้นที่นี่ สำหรับสืบสวนสอบสวนรหัสที่คุณจำเป็นต้อง เขียนทุกคนควรจะไปที่นั่น และที่เป็นเพียงรหัส คุณจะต้องเขียน เพราะเหมือนอย่างที่เราได้ยินสิ่งที่คุณต้อง ทำคือการเปลี่ยนเหล่านี้สีฟ้าญาติ ระดับสีแดงและสีเขียวจากแต่ละพิกเซล ที่คุณได้อ่านในและตอนนี้คุณ จะเขียนมันออกมา ฉันจะได้รับ - ถ้าฉันมีสิ่งนี้ ที่เรียกว่าสามขวาที่นี่และมันเป็นของ ประเภท RGBTRIPLE - ดีถ้าเรามองใน bmp.h, สิ่งที่เป็น RGBTRIPLE? นักเรียน 77: มันเป็นโครงสร้าง เจสัน Hirschhorn: RGBTRIPLE เป็น struct เราจะเห็นว่าทางด้านขวาลงที่นี่ และอื่น ๆ ถ้าผมต้องการที่จะเข้าถึงพูด ระดับสีแดงของ struct ฉันจะ เข้าถึงระดับสีแดงของ struct นี้ [CLASS พึมพำ] นักเรียน 78: RGBTRIPLE.rgbtred? เจสัน Hirschhorn: เป็นความถูกต้องหรือไม่ นักเรียน 79: มันควรจะเป็นสาม จุดแทน RG​​BTRIPLE จุด? เจสัน Hirschhorn: ทริปเปิ ทริปเปิเป็นตัวแปรท้องถิ่นเพื่อ ที่นี่มีคำแนะนำที่นี่ ดังนั้นเราก็ใช้เครื่องหมายจุด นี้จะให้ฉันระดับของสีแดง ถ้าผมต้องการที่จะเปลี่ยนมันฉันเพิ่งตั้ง มันเท่ากับสิ่งที่แตกต่าง ดังนั้นอีกครั้งบรรทัดของรหัสนี้เข้าถึง ตัวแปรนี้อยู่ภายในนี้และ เราสามารถตั้งค่าให้สิ่งใหม่ ๆ ดังนั้นสำหรับสืบสวนสอบสวนอีกครั้งนี้ ในสาระสำคัญสิ่งที่เราต้องทำ ง่ายมาก เพียงแค่เปลี่ยนระดับญาติบางส่วนและ นี่คือที่รหัสที่จะไป ปรับขนาดในมืออื่น ๆ , เป็นบิต trickier ในความเป็นจริงน่าจะปรับขนาด ส่วนหนึ่งของปัญหาที่ยากชุดนี้ เรามีสามนาทีเพื่อไปกว่านั้น แต่อีกครั้งที่เราได้เขียนแล้ว มากที่สุดของรหัสนี้เพื่อให้เรา ควรจะคุ้นเคยสวย สิ่งที่มีบางสิ่งบางอย่างที่เราต้องการที่จะทำใน ปรับขนาดถ้าคุณได้อ่านกว่า ปัญหาการตั้งค่า? ถ้าคุณให้พวกเขาให้ฉันเรา สามารถพูดคุยเกี่ยวกับพวกเขา อะไรบางสิ่งบางอย่างที่เราต้องการจะทำคืออะไร นักเรียน 80: แนวตั้ง - เพื่อให้คุณได้ปรับขนาดในแนวนอนนั้น แต่ปรับขนาดในแนวตั้งด้วยหรือไม่ เจสัน Hirschhorn: ดังนั้นถ้าเราได้รับ พิกเซลและเราต้องการที่จะปรับขนาดได้โดย ปัจจัยที่สองได้ในขณะนี้ความต้องการที่จะ ปรับขนาดในแนวนอนและการปรับขนาด ดิ่ง ไม่ที่ทำให้รู้สึก? ใช่ เพื่อที่ว่าน่าจะเป็น ความท้าทายที่ยิ่งใหญ่ที่สุด และเราจะพูดคุยเกี่ยวกับว่าในวินาที ใช่ นักเรียน 81: วิธีที่ฉันคิดว่ามัน คุณจำเป็นต้องได้รับการพิมพ์ออก - เจสัน Hirschhorn: รอ ไม่ได้บอกเราว่าสิ่งที่คุณทำ เรากำลังจะพูดคุยในตรรกะ นักเรียน 81: ตกลง สิ่งที่เป็นคำถามได้หรือไม่ เจสัน Hirschhorn: คุณเพียงแค่ ยกมือของคุณ มีคำถามไม่ได้ ผมขอนำเสนอ ให้ฉันเพียงแค่พูดคุยสั้น ๆ นี้ ดังนั้นเราจึงได้หนึ่งพิกเซลเราต้องการที่จะ ทำซ้ำได้ทั้งแนวนอนและ ดิ่ง ดังนั้นความนึกคิดสิ่งที่เราทำที่นี่คือเรา อ่านได้ในพิกเซลของเราเราเขียนมัน แต่หลายครั้ง แต่เราก็มีเคล็ดลับของเราที่นี่เพราะ แล้วเราต้องการที่จะข้ามไป บรรทัดถัดไปและเขียนได้ที่ จุดเริ่มต้นของบรรทัดถัดไป ดังนั้นหากเราต้องการที่จะทำซ้ำทั้ง แนวนอนและแนวตั้งคืออะไร หนึ่งในวิธีที่ดีที่จะทำว่า - หนึ่งที่ดี แต่จะทำอย่างไรที่ ดังนั้นเราจึงไม่จำเป็นที่จะแสวงหาอย่างต่อเนื่อง รอบไฟล์ของเราที่จะวางสิ่งที่ คำถามที่อาจไม่ได้ ทำให้ความรู้สึก แต่ฉันคิดว่า คำตอบก็จะช่วยให้ นักเรียน 82: สร้างอาร์เรย์? เจสัน Hirschhorn: ดังนั้นขอคิด ของแต่ละไฟล์เป็นแถว ลองคิดในแง่ของแถว ถ้าเรามีแถวแรกของเราจากขนาดเล็ก ภาพเราสามารถทำให้แถวนั้น เป็นแถวขนาดใหญ่จากภาพขนาดใหญ่ แล้วทำซ้ำแถวนั้น แต่ หลายครั้งจะต้องมีการจำลองแบบ แทนที่จะไปพิกเซลโดยพิกเซล ที่ได้รับสับสนเมื่อ จัดการกับไฟล์ เพราะถ้าเรามี - ผมทำงานออกจากพื้นที่ หากเป็นไฟล์ของเราและเราได้ว่า หนึ่งพิกเซลมีและเราต้องการที่จะนำมัน ที่นั่นเรายังมีบางสิ่งบางอย่าง จำเป็นที่จะต้องไปที่นั่นเมื่อเราอยู่ที่ การเขียนและการสร้างไฟล์ใหม่ของเรา - ไฟล์ของเราที่เป็นใหญ่เป็นสองเท่าของ แต่มันก็ยากมากที่มีฟังก์ชั่นไฟล์ ที่จะข้ามไปรอบ ๆ เพื่อขึ้นบรรทัดใหม่ เช่นนั้นแล้วก็จะกลับไปที่นี่ และนำสิ่งที่อยู่ในนั้น มันเป็นไปไม่ได้เกือบที่จะทำบางสิ่งบางอย่าง เช่นนั้นหากที่ทำให้รู้สึก ดังนั้นหากเราคิดในแง่ของแถวที่เราสามารถทำได้ ใช้แถวของเราและใส่แล้วมัน - ทำซ้ำแถวในแนวตั้ง และนั่นคือวิธีที่เราจัดการกับการปรับขนาด ในแนวตั้งมากกว่าแนวนอน นั่นคือชนิดของรวดเร็วและ ทำให้เกิดความสับสนเล็กน้อย แต่น่าเสียดายที่เวลาของเราจะขึ้น ฉันจะยืนอยู่นอกสำหรับผู้ที่คุณ ที่นี่ที่มีคำถามเกี่ยวกับ ปัญหาชุดรวมทั้งการกู้คืน จึงขอเลื่อนออกไปตอนนี้ และอีกครั้งถ้าคุณมีคำถามใด ๆ เราสามารถแชทได้ออกไปข้างนอก