>> [მუსიკის დაკვრა]
>> Zamyla CHAN მოდით დაძლევის ფეხზე.
აღდგენა ალბათ ჩემი საყვარელი pset, და ძირითადად იმიტომ, რომ მე ვფიქრობ, რომ
მართლაც, მართლაც მაგარი.
ძირითადად, თქვენ მოცემული მეხსიერების ანკეტა ფაილი, რომელშიც
სურათები წაშლილია.
მაგრამ რაც თქვენ ვაპირებთ გავაკეთოთ არის ფეხზე მათ ყველა.
>> OK.
ასე რომ, ეს მართლაც საინტერესო, მაგრამ იქნებ ცოტა დაშინებას, რადგან თქვენ
მოცემული ცარიელი C ფაილი და თქვენ უნდა შეავსოთ იგი შემოსული
OK, მოდით დაარღვიოს ეს შევიდა მართვადი ნაწილად.
თქვენ გსურთ გახსნა მეხსიერების ბარათი ფაილი.
რომ როგორც ჩანს, მარტივი საკმარისი.
მაშინ, იპოვოს დასაწყისში საქართველოს JPG გამოსახულება.
ყველა ფაილი ამ მეხსიერების ანკეტა იქნება JPGs.
მაშინ, ერთხელ თქვენთვის დასაწყისში, თქვენ აპირებს გახსნას ახალი JPG, რომელიც
არის, ისევე, შექმნათ JPG, და დაწერა 512 byte დროს სანამ ახალი JPG არის
ვიდეო და დამთავრებული პროგრამა, ერთხელ თქვენ აღმოაჩინოს ფაილის ბოლოში.
>> ასე რომ, პირველი ნაბიჯები პირველი გახსნა მეხსიერების ბარათი ფაილი.
მაგრამ თქვენ იცით, ეს უკვე, და იქ ფაილი I / O ფუნქცია რომ აპირებს
ადასტურებს, ძალიან სასარგებლო.
OK.
რა არის JPGs?
იმიტომ, რომ ჩვენ გვჭირდება დასაწყისში იგი.
ისე, JPGs, ისევე, როგორც ცოტა რუკები, უბრალოდ sequences of bytes.
საბედნიეროდ, ყველა JPG იწყება ან 0xff, 0xd8, 0xff, 0xe0, ერთი თანმიმდევრობა
ბაიტი ან სხვა თანმიმდევრობა bytes.
>> ასე რომ იმ ოთხი ბაიტი მიუთითებს დაწყების JPG.
არც იმ ორი კომბინაციები ოთხი bytes.
და საბედნიეროდ ჩვენთვის, კიდევ ერთი ფაქტი, რომ ჩვენ შეგიძლიათ ისარგებლოს, რომ ყველა
JPG ინახება side-by-side მეხსიერების ბარათი.
მე წარმოდგენილია სტრუქტურა მეხსიერების ბარათი სქემატურად ამ
ლღობას აქ.
აქ, ყოველ კვადრატულ, ყველა მართკუთხედი, წარმოადგენს 512 ბაიტი, და იგი იწყებს
ერთად რუხი, რომ ჩვენ არ ნამდვილად აქვს JPG.
>> მაგრამ მაშინ ჩვენ საბოლოოდ მოხვდა ბლოკის ვარსკვლავი.
ეს იმას ნიშნავს, რომ პირველი ოთხი ბაიტი out იმ 512 ერთი იმ ორ
დაწყებული sequences of JPG.
და ჩვენ წავიდეთ იქ და შემდეგ კიდევ ერთი JPG დამთავრდა, მომდევნო ერთი იწყება.
ჩვენ არ ოდესმე აქვს სხვა ნაცრისფერი სივრცის შორის.
>> მაგრამ როგორ უნდა რეალურად წაიკითხა, და წაიკითხა 512 ბაიტი ისე, რომ ჩვენ შეგვიძლია
შედარებით პირველ რიგში?
კარგად, მოდით დავუბრუნდეთ fread, რომელიც იღებს struct, რომელშიც იქნება
ბაიტი, რომ თქვენ კითხულობს.
ასე რომ, თქვენ აპირებს დააყენოს იმ იქ -
ზომა, რაოდენობა და შემდეგ inpointer რომ თქვენ კითხულობს.
ახლა, ჩვენ გვინდა, რომ წაკითხვის 512 დროს, და ჩვენ გვინდა შესანახად ამ ბუფერული,
მე ვაპირებ მოვუწოდო მას.
>> ძირითადად, ჩვენ ვაპირებთ გამართავს გადატანა იმ 512 ბაიტი და ამის
ყველაფერი ეს, არა?
ჩვენ არც ვაპირებთ შედარების პირველი ოთხი ბაიტი, ან ჩვენ ვაპირებთ
წაიკითხეთ ის, OK?
მაშ მონაცემები მაჩვენებელი მაშინ ემსახურება როგორც თქვენი ბუფერული და
inpointer, ისე, რომ უბრალოდ აპირებს იყოს თქვენი მეხსიერების ბარათი.
>> უკან ჩვენი მეხსიერების ბარათის სქემატური.
ჩვენ ვაპირებთ წაიკითხა 512 ბაიტი დროს, შენახვის ყველა 512 ბიტიანი ბლოკი
შევიდა ბუფერული, ჩატარების გადატანა იმ ბუფერული, იმ 512 ბაიტი, სანამ ჩვენ ვიცით,
ზუსტად რა უნდა გააკეთოს მათ.
ასე რომ, წლის დასაწყისში არ არის არაფერი, ისე ჩვენ წაიკითხა ბუფერული, შედარების და
ჩვენ არ გვჭირდება არაფრის იგი.
და შემდეგ, ჩვენ საბოლოოდ მოხვდა ვარსკვლავი დაბლოკოს, რაც იმას ნიშნავს, რომ ჩვენ
ნაპოვნია ჩვენი პირველი JPG.
ასე რომ ბუფერული ახლა გამართავს ბაიტი, რომ JPG.
>> მომავალი დრო 512 ბაიტი, რადგან ისინი არ ვარსკვლავი ბლოკი, ასევე
ნაწილი რომ JPG.
და JPGs უწყვეტი იქიდან წელს, სანამ ჩვენ მოხვდა შემდეგი JPG.
და შემდეგ ბუფერული შემდეგ მართავს 512 ბაიტი, რომ JPG, და
ასე შემდეგ, და ასე შემდეგ.
OK.
>> ასე რომ ერთხელ თქვენ მოხვდა პირველი ვარსკვლავით ბლოკი, პირველი JPG, როგორ ფიქრობთ,
რეალურად, ასევე, იგი უნდა გახსნას?
მოდით ახალი JPG.
Filenames for JPG ვაპირებთ იყოს ფორმატში, ნომერი, ნომერი,
number.jpg, რომ ისინი დაასახელა იმისათვის, რომელშიც ისინი გვხვდება,
იწყება 0.
>> ამიტომ პირველ JPG, რომ თქვენ იპოვოს იქნება 000.jpg.
ასე რომ, ალბათ კარგი იდეა შენარჩუნება ტრეკზე რამდენი JPGs თქვენ ი ჯერჯერობით.
ასე რომ, ფაილის სახელი.
მაგრამ როგორ რეალურად რომ?
ასევე, ჩვენ ვაპირებთ გამოვიყენოთ ფუნქცია მოუწოდა sprintf.
ცოტა ჰგავს printf, სადაც თქვენ შეგიძლიათ გამოიყენოთ placeholders for strings,
გარდა ამ შემთხვევაში, sprintf ბეჭდვა ფაილი out შევიდა მიმდინარე
დირექტორია, არ შევიდა ტერმინალში.
>> OK.
ასე რომ, აქ ჩვენ ვხედავთ, რომ ჩვენ სახელწოდება, char array, რომელიც შეინახავს
resultant სიმებიანი და ჩვენ კორიდორი სათაური ფაქტობრივი string ერთად
placeholder, ისევე, როგორც ჩვენ ისწავლა გავაკეთოთ printf.
მაგრამ ეს კოდი, რომელიც მე აქ მისცემს 2.jpg, არ 002.jpg.
ასე რომ, მე დავტოვებთ თქვენ, რათა გაირკვეს, თუ როგორ უნდა ცვლილებები placeholder, რათა
ზუსტი სახელი.
>> OK.
ასე რომ ერთხელ თქვენ sprintf'd მაშინ გახსნა, რომ ფაილი, იმიტომ, რომ ეს არსებობს
თქვენი დირექტორია, ერთად fopen გამოყენებით სათაური, და შემდეგ, რასაც რეჟიმი გსურთ
გახსნა, რომ ფაილი შემოსული
ასე რომ, ახლა რომ ჩვენ გახსნა JPG ფაილი, ახლა ჩვენ შეგვიძლია დავწეროთ 512 bytes ზე
დრო, სანამ ახალი JPG არის ნაპოვნი.
მოდით მიიღოს სხვა სახე ერთი სინტაქსი fwrite.
>> მე ვიცი, რომ მე გვიჩვენებს ამ slide ბევრი, მაგრამ მე უბრალოდ გვინდა დავრწმუნდეთ, რომ
თქვენ ბიჭები არ მიიღოთ ძალიან დაბნეული, რადგან მე ვიცი, რომ ეს ძალიან ადვილია
აღრევას პირველი და უკანასკნელი არგუმენტი, კერძოდ.
მაგრამ გახსოვდეთ, რომ თქვენ წერა თქვენი ბუფერული შევიდა out ფაილის images.
>> არის, რომ თქვენ იცით, თუ როგორ წერენ 512 ბაიტი თქვენს JPG ფაილი, რომელიც თქვენ
განთავსებულია, ასევე, გვინდა, რომ შეწყვიტოს, რომ პროცესი ერთხელ ჩვენ მიაღწია ბოლოს
ჩვენი ბარათი, რადგან არ იქნება რაიმე უფრო images უნდა მოიძებნოს.
მოდით დავუბრუნდეთ fread კიდევ ერთხელ, მე გპირდებით.
fread ბრუნდება რამდენი ელემენტი ზომა, ზომა, მზად იყო ამ წარმატებით.
იდეალურ შემთხვევაში, ეს იქნება, რასაც თქვენ გაივლის რაოდენობის, არა?
იმიტომ, რომ თქვენ წაკითხვის მცდელობისას ნომერი ელემენტების ზომა, ზომა.
მაგრამ თუ fread ვერ წაიკითხა, რომ რაოდენობის ელემენტები, მაშინ ეს კიდე დაბრუნდება
რასაც ნომერი რომ წაიკითხოს წარმატებით.
>> ახლა ერთი მნიშვნელოვანი რამ აღვნიშნო, რომ თუ თქვენ იყენებთ სხვა ფაილი I / O
ფუნქცია, როგორიცაა fgetc, ეს კიდე დაბრუნდება რამდენი ელემენტი ეს წავიკითხე წარმატებით.
რა არის სასარგებლო ამ ფუნქციის რომ თუ თქვენ იყენებთ ფუნქციები შიგნით
მდგომარეობა, რომ თქვენ შეასრულოს თავად ხოლო განსაზღვრის, რომ მდგომარეობა, რომელიც
უბრალოდ მართლაც სასარგებლო.
ასე რომ, თუ თქვენ გაქვთ ამ პირობებში, ვთქვათ, თუ fread ბუფერული, sizeof DOG, 2,
მაჩვენებელი, უდრის უდრის 1, რომელიც იმას ნიშნავს, რომ მინდა წაიკითხონ
2 ძაღლები დროს.
მაგრამ თუ fread ბრუნდება 1 ნაცვლად 2 მოსალოდნელია, ეს ნიშნავს, რომ არსებობს 2
ძაღლი დარჩა ჩემი ფაილი, არამედ 1.
მაგრამ თუ ის დააბრუნებს 2, მაშინ მე ჯერ კიდევ აქვს იმ 2 ძაღლი შიგნით ჩემი ბუფერული.
>> ახლა რომ გაძლევთ გრძნობა, თუ როგორ უნდა შევამოწმოთ ბოლომდე ფაილი, მაგრამ
მოდით გავლა ახლა ლოგიკა.
როგორ ჩვენ რეალურად ცალი ყველა ამ ელემენტების ერთად?
ერთხელ ჩვენ მოხვდა ჩვენი პირველი JPG, რადგან ჩვენ ვიცით, რომ JPGs ინახება
contiguously, ჩვენ უნდა წერა, სანამ მივაღწევთ ბოლოს ანკეტა ფაილი.
მაგრამ ჩვენ არ გვინდა დავწეროთ არაფერი სანამ შემდეგ.
ასე რომ, მნიშვნელოვანია, არა მხოლოდ, რომ ჩვენ დროს დაწყების ახალი JPG, მაგრამ თუ
ჩვენ უკვე ნაპოვნია JPG თუ არა.
>> იმ შემთხვევაში, თუ ეს დაწყების ახალი JPG, ჩვენ მინდა დავასრულო ჩვენი დღევანდელი JPG ფაილი თუ
ჩვენ ერთი ღია და ღია ახალი დაწერა შევიდა.
იმ შემთხვევაში, თუ ეს არ არის დაწყების ახალი JPG, თუმცა, ჩვენ გავაგრძელებთ იგივე JPG ფაილი
გახსნა და დაწეროთ შევიდა, რომ.
ჩვენ დავწეროთ ჩვენი ბუფერული თარგმნეს რომელი JPG ფაილი ჩვენ ღია, იმ პირობით, რომ
ჩვენ გვაქვს ერთი ღია, რა თქმა უნდა.
იმ შემთხვევაში, თუ ჩვენ ვერ ჩვენი პირველი JPG ჯერჯერობით, ჩვენ არ წერენ არაფერს.
და ეს პროცესი გრძელდება მანამ, სანამ მიაღწიონ ბოლომდე ბარათი ფაილი.
>> და ბოლოს, თქვენ გინდათ დარწმუნდით, რომ თქვენ fclose ნებისმიერი
ფაილი, რომელიც თქვენ fopened.
ერთხელ თქვენ კომფორტულად ცნებები, შევხედოთ ზოგიერთი
pseudocode, რომელიც მე შედის აქ.
პირველი, გსურთ გახსნა ბარათი ფაილი, და შემდეგ გაიმეოროს შემდეგ პროცესი
სანამ თქვენ მიაღწია ბოლოს ბარათი.
გსურთ წაიკითხა 512 ბაიტი შევიდა ბუფერული.
გამოყენება, რომ ბუფერული, თქვენ გსურთ შემოწმება თუ თქვენ დაწყების
ახალი JPG თუ არა.
და ამ კითხვაზე პასუხი იქნება იმოქმედებს თქვენი ფაილის მართვა -
რომელიც ფაილები თქვენ გახსნა, რომელიც პირობა გაქვთ დახუროს.
>> ამის შემდეგ, თქვენ უკვე ნაპოვნი JPG?
როგორ თქვენ უკვე შენახვა სიმღერა რომ?
შემდეგ, იმის მიხედვით, რომ თქვენ არც წერენ შევიდა მიმდინარე JPG, რომ თქვენ
ღია, ან არ წერენ საერთოდ, იმიტომ, რომ თქვენ ვერ JPG არავის გაუკეთებია.
და ბოლოს, ერთხელ თქვენ მიაღწია ბოლოს ფაილი, თქვენ გსურთ დახუროს ნებისმიერი
დარჩენილი ფაილი, რომ თქვენ გაქვთ გახსნილი.
ჩვენ გვინდა ვიყოთ tidy აქ.
>> და რომ, თქვენ ამოღებული ყველა დაკარგული ფაილების, რომ მეხსიერების
ბარათი, რომელიც არის საკმაოდ საოცარი feat.
ასე pat თავს უკან.
მაგრამ, არსებობს კიდევ ერთი ელემენტი pset, რომელიც კონკურსში.
თქვენ ნახავთ, რომ ყველა სურათები რომ თქვენ ამოღებული რეალურად
სურათები CS50 პერსონალი.
ასე რომ, თუ თქვენ კამპუსში ან სადმე ახლოს, მაშინ ვახდენთ
პერსონალის და განყოფილებიანი, რომელსაც აქვს საუკეთესო სურათები შემადგენლობა
მათი ამოღებული ფაილი მიიღეთ გასაოცარია პრიზი.
რომ, მაშინ თქვენ დასრულდა ფეხზე pset.
ჩემი სახელი არის Zamyla, და ეს არის CS50.