>> [MUSIC CHƠI]
>> ZAMYLA CHAN: Hãy giải quyết thu hồi.
Phục hồi có lẽ là PSET yêu thích của tôi, và chủ yếu là bởi vì tôi nghĩ rằng đó là
thực sự, thực sự mát mẻ.
Về cơ bản, bạn sẽ được một bộ nhớ tập tin thẻ trong đó
hình ảnh đã bị xóa.
Nhưng những gì bạn sẽ làm là khôi phục lại tất cả.
>> OK.
Vì vậy, nó thực sự thú vị, nhưng có lẽ một ít đáng sợ, bởi vì bạn
đưa ra một tập tin C trống rỗng và bạn phải điền nó vào
OK, vì vậy chúng ta hãy phá vỡ này vào phần quản lý được.
Bạn sẽ muốn mở tập tin thẻ nhớ.
Điều đó có vẻ đơn giản.
Sau đó, tìm đầu của một hình ảnh JPG.
Tất cả các tập tin trên bộ nhớ này thẻ sẽ được JPG.
Sau đó, khi bạn tìm thấy đầu, bạn sẽ mở một JPG mới, mà
được, như, tạo ra một JPG, và viết 512 byte tại một thời gian cho đến khi một JPG mới
tìm thấy, và kết thúc chương trình, một lần bạn phát hiện cuối của tập tin.
>> Bước đầu tiên để đầu tiên là mở các tập tin thẻ nhớ.
Nhưng anh đã biết rồi, và có một tập tin I / O chức năng đó sẽ
chứng minh rất hữu ích.
OK.
Vì vậy, JPG là gì?
Bởi vì chúng ta cần phải đầu nó.
Vâng, JPG, giống như bản đồ bit, chỉ là trình tự của các byte.
May mắn thay, mỗi JPG bắt đầu với một trong hai 0xFF, 0xd8, 0xFF, 0XE0, một chuỗi
byte, hoặc một chuỗi các byte.
>> Vì vậy, những bốn byte chỉ khởi đầu của một JPG.
Không có gì khác hơn so với hai kết hợp bốn byte.
Và may mắn cho chúng tôi, thực tế khác mà chúng tôi có thể tận dụng là mỗi
JPG được lưu trữ side-by-side trên thẻ nhớ.
Tôi đã đại diện cho cấu trúc của một thẻ nhớ sơ đồ này
trượt ở đây.
Ở đây, mỗi vuông, mỗi hình chữ nhật, đại diện cho 512 byte, và nó bắt đầu
với một màu xám trong chúng ta không thực sự có một JPG.
>> Nhưng sau đó chúng tôi cuối cùng nhấn một khối với một ngôi sao.
Điều đó có nghĩa rằng trong bốn byte đầu tiên ra những 512 là một trong hai
bắt đầu trình tự của một JPG.
Và chúng tôi đi từ đó, và sau đó một lần một JPG kết thúc, người tiếp theo bắt đầu.
Chúng tôi không bao giờ có nữa không gian màu xám ở giữa.
>> Nhưng làm thế nào để chúng ta thực sự đọc này, và đọc 512 byte để chúng tôi có thể làm cho
so sánh vị trí đầu tiên?
Vâng, chúng ta hãy quay trở lại fread, mà có trong các cấu trúc sẽ chứa
các byte mà bạn đang đọc.
Vì vậy, bạn sẽ đặt những người trong đó -
kích thước, số lượng, và sau đó inpointer mà bạn đang đọc từ.
Bây giờ, chúng tôi muốn đọc 512 tại một thời điểm, và chúng tôi muốn lưu trữ này trong một bộ đệm,
Tôi sẽ gọi nó.
>> Về cơ bản, chúng ta sẽ giữ vào những 512 byte và làm
việc với nó, phải không?
Chúng tôi không biết mình sẽ so sánh đầu tiên bốn byte, hoặc chúng ta sẽ
đọc nó vào, OK?
Vì vậy, sau đó con trỏ dữ liệu sau đó sẽ phục vụ như là bộ đệm của bạn, và
inpointer, tốt, đó là chỉ cần đi là thẻ nhớ của bạn.
>> Sao cho sơ đồ mạch thẻ nhớ của chúng tôi.
Chúng ta sẽ đọc 512 byte tại một thời điểm, lưu trữ mỗi khối 512 byte
vào một bộ đệm, nắm giữ những đệm, những 512 byte, cho đến khi chúng ta biết
chính xác những gì làm cho họ.
Vì vậy, ngay từ đầu không phải là bất cứ điều gì, vì vậy chúng tôi sẽ đọc bộ đệm, so sánh nó, và
chúng tôi sẽ không cần phải làm bất cứ điều gì với nó.
Và sau đó, chúng tôi cuối cùng đã đánh một ngôi sao ngăn chặn, có nghĩa là chúng tôi đã
JPG tìm thấy đầu tiên của chúng tôi.
Vì vậy, các bộ đệm bây giờ giữ byte từ JPG đó.
>> Lần sau 512 byte, vì họ không phải là một khối sao, cũng có
một phần của JPG đó.
Và JPG là liên tục từ đó trên trong, cho đến khi chúng tôi nhấn JPG tới.
Và sau đó bộ đệm sau đó giữ 512 byte cho JPG đó, và
như vậy, và vv.
OK.
>> Vì vậy, khi bạn nhấn đóng vai chính đầu tiên khối, JPG đầu tiên, làm thế nào bạn
thực sự, tốt, mở nó?
Chúng ta hãy làm một JPG mới.
Tên tập tin cho một JPG sẽ được định dạng, số lượng, số lượng,
number.jpg, trong đó họ đang có tên trong thứ tự mà chúng được tìm thấy,
bắt đầu từ 0.
>> Vì vậy, JPG đầu tiên mà bạn tìm thấy sẽ được 000.jpg.
Vì vậy, có thể là một ý tưởng tốt để theo dõi bao nhiêu JPG bạn đã tìm thấy cho đến nay.
Vì vậy, đó là tên tập tin.
Nhưng làm thế nào để bạn thực sự làm điều đó không?
Vâng, chúng ta sẽ sử dụng một chức năng gọi là sprintf.
Một chút tương tự như printf, nơi bạn có thể sử dụng giữ chỗ cho các chuỗi,
ngoại trừ trong trường hợp này, sprintf sẽ in các tập tin ra vào hiện tại
thư mục, không phải vào thiết bị đầu cuối.
>> OK.
Vì vậy, ở đây chúng ta thấy rằng chúng tôi có tiêu đề, một mảng char để lưu các
kết quả chuỗi, và chúng tôi vượt qua trong tiêu đề của chuỗi thực tế với một
giữ chỗ, giống như chúng tôi đã học để làm với printf.
Nhưng mã này mà tôi có ở đây sẽ cung cấp cho 2.jpg, không 002.jpg.
Vì vậy, tôi sẽ để lại cho bạn để tìm hiểu làm thế nào để sửa đổi giữ chỗ để làm cho
tên chính xác.
>> OK.
Vì vậy, một khi bạn đã sprintf'd sau đó bạn có thể mở tập tin đó, bởi vì nó tồn tại trong
thư mục của bạn, với fopen, bằng cách sử dụng tiêu đề, và sau đó bất cứ điều gì bạn muốn chế độ
để mở tập tin đó in
Vì vậy, bây giờ mà chúng tôi đã mở một file JPG mới, bây giờ chúng tôi có thể viết 512 byte tại một
thời gian, cho đến khi một JPG mới được tìm thấy.
Vì vậy, chúng ta hãy nhìn lại ở cú pháp của fwrite.
>> Tôi biết rằng tôi đang cho thấy slide này một rất nhiều, nhưng tôi chỉ muốn chắc chắn rằng
các bạn không nên quá bối rối, bởi vì Tôi biết rằng nó rất dễ dàng để
trộn lên đầu tiên và cuối cùng tranh luận, đặc biệt.
Nhưng hãy nhớ rằng bạn đang viết từ bộ đệm của bạn vào file hình ảnh ra.
>> Bây giờ bạn biết làm thế nào ghi 512 byte vào file JPG của bạn mà bạn đã
tạo, tốt, chúng tôi muốn dừng lại quá trình khi chúng tôi đã đạt đến cuối
thẻ của chúng tôi, bởi vì sẽ không có hơn bất kỳ hình ảnh được tìm thấy.
Vì vậy, chúng ta hãy quay trở lại fread một lần nữa, tôi hứa.
fread trả bao nhiêu mặt hàng kích thước, kích thước, đã sẵn sàng thành công.
Lý tưởng nhất, điều này là có được bất cứ điều gì bạn vượt qua trong cho số, phải không?
Bởi vì bạn đang cố gắng để đọc số các yếu tố kích thước, kích thước.
Nhưng nếu fread là không thể đọc mà số yếu tố, sau đó nó sẽ trở lại
bất cứ điều gì nó đọc số thành công.
>> Bây giờ, có một điều quan trọng cần lưu ý là nếu bạn sử dụng một tập tin I / O
chức năng như fgetc, nó cũng sẽ trở lại bao nhiêu mặt hàng nó đọc thành công.
Những gì hữu ích về chức năng này là nếu bạn sử dụng chức năng bên trong của một
điều kiện, nó sẽ thực thi chính nó trong khi xác định rằng điều kiện, đó là
chỉ thực sự hữu ích.
Vì vậy, nếu bạn có điều kiện này, nói, nếu đệm fread, DOG sizeof, 2,
con trỏ, tương đương bằng 1, mà có nghĩa là tôi muốn đọc
2 con chó vào thời điểm đó.
Nhưng nếu fread trả về 1 thay vì 2 như dự kiến, điều đó có nghĩa rằng có 2
con chó còn lại trong hồ sơ của tôi, mà là 1.
Nhưng nếu nó trả về 2, sau đó tôi vẫn còn có những 2 con chó bên trong bộ đệm của tôi.
>> Vì vậy, bây giờ mà cung cấp cho bạn một cảm giác như thế nào để kiểm tra cuối của tập tin, nhưng
hãy đi qua giờ logic.
Làm thế nào để chúng tôi thực sự mảnh tất cả những yếu tố này với nhau?
Một khi chúng ta nhấn JPG đầu tiên của chúng tôi, kể từ khi chúng ta biết rằng JPG được lưu trữ
liên tục kế nhau, chúng tôi sẽ viết cho đến khi chúng tôi đạt được kết thúc của tập tin thẻ.
Nhưng chúng tôi không muốn viết bất cứ điều gì cho đến khi đó.
Vì vậy, vấn đề, không chỉ là chúng ta đang ở khởi đầu của một JPG mới, nhưng liệu
chúng tôi đã tìm thấy một JPG hay không.
>> Nếu Đó là khởi đầu của một JPG mới, chúng tôi sẽ muốn đóng file JPG hiện tại của chúng tôi nếu
chúng tôi có một mở, và mở một cái mới để viết vào.
Nếu nó không phải là bắt đầu của JPG mới, Mặc dù vậy, chúng tôi sẽ giữ các tập tin JPG cùng
mở và viết vào đó.
Chúng tôi sẽ viết đệm của chúng tôi vào bất cứ JPG, chúng tôi đã mở, với điều kiện
chúng tôi có một mở, tất nhiên.
Nếu chúng ta đã không tìm thấy JPG đầu tiên của chúng tôi nhưng, chúng tôi không viết bất cứ điều gì.
Và quá trình này tiếp tục cho đến khi bạn đến cuối của tập tin thẻ.
>> Và cuối cùng, bạn sẽ muốn làm chắc chắn rằng bạn fclose bất kỳ
tập tin mà bạn đã fopened.
Một khi bạn cảm thấy thoải mái với khái niệm, hãy nhìn vào một số
giả, mà tôi đã bao gồm ở đây.
Trước tiên, bạn muốn mở các tập tin thẻ, và sau đó lặp lại quá trình sau đây
cho đến khi bạn đã đạt đến cuối của thẻ.
Bạn muốn đọc 512 byte vào một bộ đệm.
Sử dụng bộ đệm đó, bạn sẽ muốn kiểm tra dù bạn đang ở khởi đầu của một
JPG mới hay không.
Và câu trả lời cho câu hỏi đó sẽ ảnh hưởng đến quản lý tập tin của bạn -
các tập tin bạn mở, mà những người bạn đóng cửa.
>> Sau đó, bạn đã tìm thấy một JPG?
Làm thế nào có bạn được giữ theo dõi về điều đó?
Sau đó, tùy thuộc vào điều đó, bạn sẽ thấy một trong hai viết vào JPG hiện tại mà bạn
đã mở, hoặc không viết gì cả, bởi vì bạn đã không tìm thấy một JPG được nêu ra.
Cuối cùng, một khi bạn đã đạt đến cuối các tập tin, bạn sẽ muốn đóng bất kỳ
tập tin mà bạn đã mở còn lại.
Chúng tôi muốn được gọn gàng ở đây.
>> Và với điều đó, bạn đã thu hồi tất cả các các tập tin bị mất tích từ bộ nhớ
thẻ, đó là một kỳ công khá tuyệt vời.
Vì vậy, pat mình ở mặt sau.
Nhưng, có một yếu tố hơn các PSET, đó là cuộc thi.
Bạn sẽ thấy rằng tất cả các hình ảnh mà bạn đã phục hồi thực sự
hình ảnh của các nhân viên của CS50.
Vì vậy, nếu bạn đang ở trên khuôn viên trường hoặc một nơi nào đó gần, sau đó bạn có thể chụp ảnh với
các nhân viên, và các phần đó có hầu hết các hình ảnh với nhân viên
từ các tập tin phục hồi của họ sẽ nhận được một giải thưởng tuyệt vời.
Cùng với đó, sau đó bạn đã hoàn tất hồi phục PSET.
Tên tôi là Zamyla, và đây là CS50.